【问题标题】:Populating a foreign key table with variable user input使用可变用户输入填充外键表
【发布时间】:2011-02-14 01:51:27
【问题描述】:

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

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

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

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

由于一个国家可以有多个替代名称,因此输入如下 Chile, Chili, Chilli 将在 国家表,但实际上只有一个国家。 当我搜索来自智利的记录时,不会包括 Chili 和 Chilli。

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

我怎样才能以这样的方式组织它,智利、辣椒和辣椒会 被视为一个国家,人工干预最少。

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

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

【问题讨论】:

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


    【解决方案1】:

    无论是基于文件(Lucene、Sphinx 等)还是基于数据库(Oracle Text、MSSQL Fulltext)的搜索引擎都可以通过词库解决这个问题。也就是说,他们在同义词的基础上将单词收集在一起。作为同义词的条件比 Roget 的书中更严格,但原则是一样的。同义词将缩写词、首字母缩略词和常见的拼写错误捆绑在一起。例如,搜索词库可能会将 streetst 识别为同一事物。虽然,上下文就是一切:在字符串“St Pancras Road”中,stsaint 的同义词。

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

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

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

    另一种方法是执行 SO 对标签所做的操作。当您标记您的问题时,会出现一个下拉框,提示可用的标签。随着您输入更多字母,列表缩小。这不是万无一失的,见证tsqlt-sql 等标签的存在,但它非常好。 SO 也有一个备份,即为高级用户提供新铸造的标签列表,以便他们可以调查这些硬币并可能取消它们。但这仍然是一个手动过程。

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

    【讨论】:

      【解决方案2】:

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

      至于您的规范化问题,根据您的示例,我认为设计没有任何问题

      【讨论】:

      • 在我的示例中使用国家名称只是为了简单起见。
      【解决方案3】:

      您无法以编程方式确定 Chile 应该与 Chili 相同,后者与 Chilli 相同。使用国家/地区示例,您可以拥有一个输入到数据库中的国家/地区列表,并拥有一个用户可以从中选择的下拉列表。

      如果数据都是用户输入的,你只能匹配如果它是完全相同的,因此它们的含义是相同的。

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

      【讨论】:

      • 我觉得国家名称是一个不好的例子来解释我的问题。另一个例子:现代艺术博物馆和现代艺术博物馆。词法不同,但指的是一个实体。我知道以编程方式检测到这一点是不可能的。我只是在寻找处理它的一般方法,希望有人以前处理过类似的事情。一种解决方案是在用户界面中允许用户将 MoMA 标记为现代艺术博物馆的变体,然后网站管理员可以对数据库应用适当的更改。但是,如果有成千上万条这样的记录呢?
      猜你喜欢
      • 2018-06-26
      • 1970-01-01
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多