2

我正在设计一个数据库,并且想知道我应该使用哪种方法。我将描述我打算设计的数据库以及我可以用来将数据存储在表中的可能方法。

请推荐我应该使用哪种方法,为什么?

关于数据:

A)我有七个需要注意的属性。这些只是示例,而不是我打算存储的实际示例。让我称呼他们:

1)名称

2)DOB(修改..我之前在这里输入了年龄..)

3)性别

4)婚姻状况

5)工资

6)母语

7)父亲的名字

B)表中至少有 10000 行,从长远来看,它们可以从那里上升

C)属性的数量可以随着时间的推移而改变。也就是说,可以将新属性添加到现有数据集中。不会删除任何属性。

方法一

创建一个包含 7 个属性的表并按原样存储数据。如果需要添加新属性,则添加新列。

  • 优点:更容易阅读数据和信息组织良好

  • 缺点:对于某些值未知的属性,某些行中可能有很多空值。

方法二

创建一个具有 3 个属性的表。让他们被称为:

1) Attr_Name :存储属性名称。例如姓名、年龄、性别等

2) Attr_Value :存储上述属性的值,例如:Tom, 25, Male

3)唯一ID:唯一标识数据库中的名称、值对。例如。社会保障号

因此,在方法 2 中,如果需要为某些行添加新属性,我们可以将它们添加到我们创建的 hashmap 中,而不用担心 null 值。

  • 优点:Hashmap 结构。消除空值。

  • 缺点:数据不易阅读。信息不容易掌握。

C) 问题

哪个是更好的方法。?

我觉得方法1是更好的方法。因为处理空值并不难,而且数据组织良好,而且很容易掌握这个数据之王。请建议我应该使用哪种方法,为什么?

谢谢!

4

3 回答 3

4

这是典型的窄表(基于属性)与宽表的讨论。方法 #2 的问题在于,您可能必须将数据转换为用户可以使用的形式(回到宽视图格式)。随着行数的增加和属性数的增加,这可能会占用大量资源。在原始表格视图中查看表格也很困难,看看发生了什么。

我们公司已经多次讨论过这个问题。我们有一些表非常适合属性类型模式。我们一直决定反对它,因为需要对数据进行透视,并且无法查看数据并使其有意义(但这对我们来说是两个问题的较小者 - 我们只是不想旋转数百万行数据)。

顺便说一句,我不会将年龄存储为数字。我会存储出生日期,如果你有的话。另外,我不知道“母语”是指什么,但是,如果是母亲说的语言,我会将其作为 FK 存储到主语言表中。由于语言拼写错误,它更有效并减少了错误数据的问题。

于 2013-08-13T17:34:17.140 回答
3

您的第二个选择是您可能犯的最严重的设计错误之一。仅当您有数百个属性不断变化并且在对象之间绝不相同(例如医学实验室测试)时,才应该这样做。如果您需要这样做,那么在任何情况下都不要使用关系数据库来执行此操作。到目前为止,NOSQL 数据库处理 EAV 设计比关系数据库更好。

设计 2 的另一个问题是,几乎不可能拥有良好的数据完整性,因为您无法正确执行 FK 和数据类型并为数据添加约束。由于这些东西不应该被设计成只在应用程序中发生,因为应用程序以外的东西经常会影响数据,仅这个因素就足以让你的第二个想法变得愚蠢和鲁莽。

一般来说,第一个设计会表现得更好。编写查询会更容易,它会迫使您考虑添加属性时需要更改的内容(这是加号而不是减号),而不必设计为始终显示所有属性(无论您是否需要它们)。如果你会有很多空值,那么添加一个相关表而不是更多列(你可以有一对一的相关表)。通常在这种情况下,您可能拥有一些您知道只有记录子集的内容,并且它们通常很自然地按主题分组。例如,您可能具有属于一个表的一般人员相关属性(姓名、电话、电子邮件、地址)。然后,您可能拥有属于单独表的学生相关属性和属于第三个表的教师相关属性。

还有第三种设计可能性。如果您有一组预先知道的属性,则将它们放在一个表中,并为在设计时无法确定的属性创建一个 EAV 表。当应用程序希望用户能够灵活地添加客户特定的数据字段时,这是常见的模式。

于 2013-08-13T18:46:51.613 回答
1

我认为没有人可以真正立即确定哪个更好,但这里有几件事需要考虑:

  1. 你有样本数据吗?如果是,那么看看是否会有很多空值,如果没有,那么就选择选项 1
  2. 您对属性将如何增长有很好的了解吗?例如,查看您上面列出的属性,您可能并不知道所有这些属性,但它们确实存在 - 所以理论上您可以填写表格。如果您将有很多稀疏数据,那么#2可能会起作用
  3. 当您确实获得新类型的数据时,您可以将其分组到另一个表中并使用外键吗?例如,如果你想捕获地址,你总是可以有一个引用初始表的地址表
  4. 您打算使用什么类型的查询?查询键值表比“普通表”要难得多(不是超级难,只是更难——如果您习惯使用隐式连接等来规范化数据,那么这可能没什么大不了的)。

总体而言,在您实施 #2 之前,我会非常小心 - 我已经针对某些特殊情况(指标收集,我有几十个不同的指标并且不想维护几十个不同的表),但总的来说它更多麻烦大于它的价值。

对于这样的事情,我只需要创建一个表,然后添加列,或者在必要时为新的数据结构创建新表。

于 2013-08-13T17:41:32.650 回答