用于存储也支持自动完成的文本输入的数据库设计

时间:2016-06-10 16:23:34

标签: database-design

我正在设计一个系统,允许用户指定他们过敏的项目。当他们开始将每个过敏原绑在一个文本字段中时,我打算提供自动填充式的建议,以便他们可以从其中一个建议中选择或者自己完成过敏原的输入。建议列表将来自查询表,其中仅包含最常见的过敏原。

我从查询表中提供建议没有问题,但我正在试图找出在数据库中保存相关过敏原的最佳方法,其中这些过敏原可能是已经在查找表中的某些东西,或者是自定义给用户(并且不会添加到查找表中)。我可以想到两种可能的解决方案,但它们似乎都不完美。

选项1将每个用户的过敏原存储为文本,如: user:id,name
allergen_lookup:名字
user_allergies:user_id,过敏原

在这种情况下,allergen_lookup和user_allergies表之间没有关系,user_allergies.allergen是一个文本字段。这个问题基本上归结为(缺乏)标准化,但至少它支持自定义过敏原而不需要额外的表格。

选项2使用额外的表来存储自定义过敏原,如: user:id,name
allergen_lookup:id,name
user_allergies:user_id,allergen_id
user_custom_allergies:user_id,custom_allergy

在这种情况下,user_allergies.allergen_id链接到allergen_lookup.id。 user_allergens表用于存储用户与已知过敏原(来自查找表)之间的关联,user_custom_allergies表用于跟踪未知过敏原(不在查找表中的过敏原)。这个问题是使用两个表来实质上跟踪相同类型的信息(用户过敏原)。

所以,我为这篇冗长的描述道歉,但是有关如何最好地存储这些内容的任何建议?

TIA

1 个答案:

答案 0 :(得分:0)

你可能会过于复杂,但告诉我,如果我没有回答问题。

我将如何处理这个问题:

我会有一个用户,userAlergies和过敏表 - userAlergies是交集表。

这将允许您显示数据库当前在用户输入时存储的所有过敏症。这也将允许您拥有一个不重复数据的规范化数据库。这是因为交叉表将允许您将过敏与用户联系起来,而不会干扰过敏表。

对未来提出一些建议。使用正常的表单过程来破坏数据库问题。它将帮助您确定数据库的结构和最佳方法。