防止在表中插入没有外键且具有阿拉伯值的重复记录

问题描述 投票:0回答:1

我是 ASP.NET Core 的初学者。

我有一个表,在某些情况下没有键列,它的三列是名字、姓氏和父亲的名字。是否有算法或查询可以防止在数据库中插入重复记录?列值采用阿拉伯语言。

很难识别我的组合键等于数据库列,并且经常因为输入单个字符而被错误。

你有比较阿拉伯名字的解决方案吗?这样如果他们的书写类型不同,比较算法就会识别出来?

例如 ??? 是同一个 ??? ,但是 == 不认识这个

感谢您的帮助

你有比较阿拉伯名字的解决方案吗?这样如果他们的书写类型不同,比较算法就会识别出来?

asp.net-core duplicates arabic
1个回答
0
投票

我有一个表,在某些情况下没有键列 条件,其中三列是名字、姓氏和 父亲的名字。是否有算法或查询可以阻止插入 数据库中有重复记录?

嗯,没有现成的解决方案可用。您应该将整个重复检查步骤分成较小的块,以获得预期的结果。

首先,您可以使用 NormalizationForm 来检查 unicode 规范化形式,这表明 Unicode 字符串是使用完整规范分解进行规范化的。

在下一阶段,您应该使用 Regex 消除 unicode 变音符号来相应地比较您的值。

最后,您应该使用 StringComparison.OrdinalIgnoreCase 检查您的名字的相等性。

让我们看看实践中如何实现:

用于标准化阿拉伯名称、删除变音符号的静态类:

public static class ArabicNameComparer
{
    public static bool AreEqual(string name1, string name2)
    {
       
        name1 = NormalizeArabicName(name1);
        name2 = NormalizeArabicName(name2);

        
        return string.Equals(name1, name2, StringComparison.OrdinalIgnoreCase);
    }

    private static string NormalizeArabicName(string name)
    {
        
        name = RemoveDiacritics(name);

        
        name = NormalizeHamza(name);

   
        name = name.Normalize(NormalizationForm.FormC);

        return name;
    }

    private static string RemoveDiacritics(string text)
    {
        
        string normalized = text.Normalize(NormalizationForm.FormD);
        Regex regex = new Regex(@"\p{Mn}", RegexOptions.Compiled);
        return regex.Replace(normalized, string.Empty);
    }

    private static string NormalizeHamza(string text)
    {
        return text.Replace('أ', 'ا').Replace('إ', 'ا').Replace('آ', 'ا').Replace('ى', 'ي');
    }
}

测试用例:

为了检查名称是否重复或注释,我正在考虑两个阿拉伯字符,它们是

"محمد"
"مَحْمُد"
让我们检查一下它们是否被视为重复:

string name1 = "محمد";
string name2 = "مَحْمُد";
bool equal = ArabicNameComparer.AreEqual(name1, name2);

输出:

注意: 正如您所看到的,从两个给定的阿拉伯字符我们可以检查它们是否重复。按照同样的方式,您应该根据您的要求实施。请记住,这只是我们可以做到这一点的一种方法,而不是您的场景的精确解决方案。您可以按照这种方法继续进行。此外,对于任何类型的自定义实现,请研究此官方文档。

© www.soinside.com 2019 - 2024. All rights reserved.