我有一个网站,用户希望用户能够识别他们的种族。如果只有一级层次结构,那么建模的最佳方法是什么?
解决方案1(单表):
Ethnicity
- Id
- Parent Id
- Name
解决方案2(两张表):
Ethnicity Group
- Id
- Name
Ethnicity
- Id
- Ethnicity Group Id
- Name
我将使用此功能,以便用户可以根据种族搜索其他用户。哪两种方法对我有用?还有其他方法我没考虑过吗?我正在使用MySQL。
答案 0 :(得分:1)
在现实世界中有种族群体,所以你需要两张桌子,而不是一张桌子。现实世界有三个级别(最顶级的是Race),但我知道这里可能没有必要。如果你把三个级别压成两个,你必须要小心,并在开始时正确地将它们全部放好。然而,他们会容易受到那些说他们想要真实事物的人的影响,你可能不得不改变它,或者改变结构以适应更多...后来的更多工作)。
如果你按照现实世界正确地做到了,那么这个问题就会被消除。如果你想要Race,请告诉我,我会更改模型。
这些表格太小了,键太有意义了,无法为它们添加Id-iot列;将它们保留为纯关系键,否则将失去Relational引擎的功能。如果你真的想要窄键,请使用CHAR(2)EthnicityCode,而不是NUMERIC(10,0)或无意义的数字。
Link to Ethnicity Data Model(加上你的另一个问题的答案)
Link to IDEF1X Notation适用于那些不熟悉关系建模标准的人。
答案 1 :(得分:0)
如果现实世界中没有“种族群体”,我建议你不要在数据模型中引入一个。
您可以使用第二个查询执行的所有查询,也可以使用第一个查询,因为您只需选择FROM ethnicity AS e1 JOIN ethnicity AS es ON (e2.ethnicity_id = e1.parent_id)
。
答案 2 :(得分:0)
我不想尴尬,但你打算怎么做混血人呢?我认为你能想到的最好的是一个简单的单级枚举,就像你在人口普查表上得到的那种(例如'黑','怀特','亚洲','西班牙裔'等)。它并不理想,但它允许人们相当容易地自我识别。像种族和种族这样的概念是不够的,而不是试图在它们之上创建额外的(基本上没有意义的)层次结构,所以我的直觉就是保持简单。