1

我有 2 张桌子。一个人通过电子邮件地址和唯一的 ID 不存储任何内容。这两个字段都是独一无二的。我有另一个表存储有关一个人的数据。姓名、电话、地址、职业等。person 表中有固定数量的字段。我相信10是这个数字。

进行此设置的原因是我通过电子邮件跟踪个人的更改,因为这是我拥有的关于某人的唯一独特信息。这些人可能会通过几种方法在我的网站上发帖,但我不会长时间在我的网站上发帖。根据他们发帖的位置和方法,我会收集某些数据。数据可能会随着时间而改变。人们搬家、更换电话号码或职业。所以我有几条记录来匹配一封电子邮件,以便我可以显示随着时间的变化。

我的问题是,这是一个更好的 MySQL 设置。我确定这是一个加载的问题。我应该有:

ID | EmailID | Name | Phone | Address | City | Created | etc....

或者

ID | EmailID | FieldType | Value | Created 

第一个设置显然将一个人的所有数据与关联的 emailID 一起存储在一行中。第二个字段逐字段存储数据。因此,我可以插入一行,其中包含 FieldType和 and下occupation的值,而不是整个数据集。developeremailID

由于不是每次插入都需要所有数据,我觉得第二种方法最好,但我不是 100% 确定。使用第二种方法,我只添加一行并插入我需要的内容,而不是整行。

希望这是有道理的。

4

1 回答 1

1

第二种方法称为实体属性值建模 (EAV)。

一般来说,首选第一种方法。EAV 的问题之一是列的类型。例如,您的列之一是created,它可能是一个日期列。其他的似乎是字符串。

使用 EAV 结构,很难维护外键关系。对行值分配约束更加困难。从一行返回所有值的查询需要将多行放在一起。而且,由于必须重复实体信息(电子邮件就是您的情况),它们通常会占用更多空间。

在某些情况下,EAV 是正确的解决方案。但是,我鼓励您使用所有列都在一个表中的第一个结构。就性能或插入数据而言,拥有 NULL 值不是问题。

于 2013-09-18T18:32:26.310 回答