Database design 使用可变用户输入填充外键表

Database design 使用可变用户输入填充外键表,database-design,foreign-keys,user-input,normalization,Database Design,Foreign Keys,User Input,Normalization,我正在开发一个基于用户贡献数据的网站, 使用常规HTML表单提交 为了简化我的问题,我们假设 表单:“用户名”和“国家”(这只是一个示例,而不是 实际地点) 数据库中将有两个表:“国家”和“用户” “users.country_id”是“countries”表的外键 (一对多) 初始数据库将为空。来自世界各地的用户将 提交他们的姓名和居住的国家,并最终提交 “国家”表将填写中的所有国家名称 世界 由于一个国家可以有多个备选名称,输入如下 智利、辣椒、辣椒将在世界上创造3项不同的记录 国家表,但实

我正在开发一个基于用户贡献数据的网站, 使用常规HTML表单提交

为了简化我的问题,我们假设 表单:“用户名”和“国家”(这只是一个示例,而不是 实际地点)

数据库中将有两个表:“国家”和“用户” “users.country_id”是“countries”表的外键 (一对多)

初始数据库将为空。来自世界各地的用户将 提交他们的姓名和居住的国家,并最终提交 “国家”表将填写中的所有国家名称 世界

由于一个国家可以有多个备选名称,输入如下 智利、辣椒、辣椒将在世界上创造3项不同的记录 国家表,但实际上只有一个国家。 当我搜索来自智利的记录时,辣椒和辣椒将不包括在内

所以我的问题是-什么是最好的方式来处理一个问题 类似这样的情况,条件是初始数据库 空,没有其他可用资源,所有内容都基于 用户输入

我怎样才能把它组织得像智利、辣椒和辣椒那样好呢 被视为一个国家,人工干预最小

当涉及到规范化用户时,最佳实践是什么 提交的数据,是否有科学术语?我敢肯定 这是一个常见的问题

再说一遍,我使用国家名称只是为了简化我的问题,它可以是
任何可能有不同拼写的东西。

我想说的是使用国家的下拉列表,您可以使用javascript轻松填充它。你可以在这里找到所有国家的名单


至于你的标准化问题,根据你的例子,我看不出设计有任何问题

你不能通过编程确定智利应该和Chili一样,Chili和Chili一样。通过国家/地区示例,您可以在数据库中输入一个国家/地区列表,并有一个下拉列表供用户选择

如果数据都是用户输入的,则只有当数据完全相同时才能进行匹配,因此它们的含义相同


你可能会想出一个算法,将相似但不相似的单词关联起来,这只会导致不确定的结果(灾难)。例如(使用与您所在国家不同的示例),您可能会通过编程方式确定单词fight和sight仅相差一个字母,因此它们是相似的。但它们真的是吗?仅仅因为这两个词在语法上是相近的,并不意味着它们在语义上也是相近的。我猜这就是你想要的

无论是基于文件的搜索引擎(Lucene、Sphinx等)还是基于数据库的搜索引擎(Oracle Text、MSSQL Fulltext),都可以用同义词表解决这个问题。也就是说,它们以同义词的形式收集单词。作为同义词的条件比罗格的书中更严格,但原则是一样的。同义词包括缩写词、首字母缩写词和常见拼写错误。例如,搜索词典可能会将street和st识别为同一事物。尽管如此,上下文就是一切:在字符串“St Pancras Road”中,St是圣人的同义词

那么,这对你有帮助吗?在一定程度上。它建议您要实现的类型:

string      | canonical
------------+----------
street      |
st          | street
strete      | street
Chile       |
chilly      | Chile
chili       | Chile
不幸的是,建立和维护同义词库需要人类的创造力和努力。建立分类法需要专业知识;跟踪新添加的内容需要时间。另一件事是,即使有了同义词表,匹配的可能性仍然存在:MoMA可能与现代艺术博物馆相同,但它与SFMOMA或NYMOMA相同吗?不完全一样,但可能有90%是一样的

另一种方法是这样做,即使用标记。当您为问题添加标签时,会出现一个下拉框,提示可用的标签。你打了更多的信,名单就缩小了。这并不是万无一失的,看看像
tsql
t-sql
这样的标签的存在,但是它非常好。所以也有一个备份,那就是为超级用户提供一份新铸造的标签列表,以便他们可以调查这些硬币,或许可以撤销它们。但这仍然是一个手工过程


唉,没有任何一种算法能告诉我们,现代艺术博物馆与现代艺术博物馆是一样的,更不用说搞清楚它是否引用了纽约或旧金山的制度。 在我的例子中,使用国家名称只是为了简单起见。我觉得国家名称是一个不好的例子来解释我的问题。另一个例子:MoMA和现代艺术博物馆。词汇上不同,但指一个实体。我知道这是不可能通过编程来检测的。我只是在寻找处理它的一般方法,希望有人以前也处理过类似的事情。一个解决方案是在用户界面中添加一些东西,允许用户将MoMA标记为现代艺术博物馆的变体,然后网站管理员可以对数据库进行适当的更改。但是如果有成千上万的这样的记录呢?