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

时间:2010-04-30 02:18:38

标签: database-design foreign-keys user-input normalization

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

为了简化我的问题,我们假设将有两个字段 形式:“用户名”和“国家”(这只是一个例子,而不是 实际网站)。

数据库中将有两个表:“countries”和“users” “users.country_id”是“countries”表的外键 (一到多)。

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

由于一个国家/地区可以有多个替代名称,因此请输入 智利,辣椒,辣椒将产生3种不同的记录 国家表,但实际上只有一个国家。 当我搜索智利的记录时,辣椒和辣椒将不包括在内。

所以我的问题是 - 处理问题的最佳方法是什么? 像这样的情况,条件是初始数据库是 空的,没有其他资源可用,一切都是基于 用户输入?

我如何以智利,辣椒和辣椒的方式组织它 被视为一个国家,人为干扰最小。

用于规范用户的最佳做法是什么? 提交的数据是否有科学术语?我确定这一点 是一个常见的问题。

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

3 个答案:

答案 0 :(得分:1)

搜索引擎是否基于文件(Lucene,Sphinx等)或数据库(Oracle Text,MSSQL Fulltext)使用同义词库来解决此问题。也就是说,他们在同义词的基础上收集词汇。作为同义词的资格比Roget的书更严格,但原则是相同的。同义词捆绑缩写,首字母缩略词和常见的拼写错误。因此,例如,搜索同义词库可能会将 street st 标识为同一个东西。虽然,上下文就是一切:在字符串“St Pancras Road” st saint 的同义词。

那么,这对你有帮助吗?在一定程度上。它表明了你想要实现的那种东西:

string      | canonical
------------+----------
street      |
st          | street
strete      | street
Chile       |
chilly      | Chile
chili       | Chile

不幸的是,建立和维护词库需要人类的聪明才智和努力。建立分类标准需要专业知识;跟踪新增内容需要时间。另一件事是,即使使用同义词库,匹配仍然是概率性的: MoMA 可能与现代艺术博物馆相同,但它与 SFMOMA相同 NYMOMA ?不完全但可能90%相同?

另一种方法是做标签所做的事情。当您标记问题时,会出现一个下拉框,提示可用标记。当您输入更多字母时,列表缩小了。这不是万无一失的,见证了tsqlt-sql等标签的存在,但它非常好。因此,它还有一个备份,即为超级用户提供新鲜标签列表,以便他们可以调查这些硬币并可能对它们进行调整。但这仍然是一个手动过程。

唉,没有任何算法可以说 MoMA 现代艺术博物馆相同,更不用说弄清楚它是否引用了该机构在纽约或旧金山。

答案 1 :(得分:0)

我会说使用国家/地区的下拉列表,您可以使用javascript轻松填充它。您可以在此处找到所有国家/地区列表http://openconcept.ca/blog/mgifford/text_list_all_countries

关于你的规范化问题,根据你的例子我没有看到任何设计问题

答案 2 :(得分:0)

您无法以编程方式确定智利应与 Chili 相同,后者与 Chilli 相同。使用国家/地区示例,您可以获得您在数据库中输入的国家/地区列表,并具有用户可以选择的下拉列表。

如果数据全部是用户输入的,那么只有匹配才能完全相同,因此它们的含义相同。

您可能提出了一个算法,该算法将相似的词关联起来,但恕我直言,这只是要求非确定性结果(灾难)。例如(使用与您的国家不同的示例),您可以通过编程方式确定单词 fight sight 只有一个字母,因此它们是相似的。但他们真的吗?仅仅因为这两个词在句法上是接近的并不意味着它们在语义上也是接近的。我猜这就是你所追求的。