Database design 空或引用现有数据

Database design 空或引用现有数据,database-design,database-normalization,one-to-one,Database Design,Database Normalization,One To One,我一直在试图理解这个话题,但我并没有真正理解它,这是一个真正的疑问,我只是坚持下去,没有它我将一事无成 我知道拆分表并保持其简短是一种最佳做法,但它并不真正适用于我的情况,因为我了解到,不经常调用的数据应该拆分,但这些属性经常被调用,在我的例子中,每当每个成员被加载到前面,他的细节也会被拉起 有关我的数据库的详细信息: 在我的名为Member的主表中有18列,成员表中的每列“单独”仅依赖于主键MemberID 有些列有空值,我的理解是,在MySQL中,空值不分配任何空间 这就是我被困的地方

我一直在试图理解这个话题,但我并没有真正理解它,这是一个真正的疑问,我只是坚持下去,没有它我将一事无成

我知道拆分表并保持其简短是一种最佳做法,但它并不真正适用于我的情况,因为我了解到,不经常调用的数据应该拆分,但这些属性经常被调用,在我的例子中,每当每个成员被加载到前面,他的细节也会被拉起

有关我的数据库的详细信息:

  • 在我的名为
    Member
    的主表中有18列,成员表中的每列“单独”仅依赖于主键
    MemberID
  • 有些列有空值,我的理解是,在MySQL中,空值不分配任何空间
这就是我被困的地方

我应该在
Member
表中保留一个具有空值的列,还是将其分隔到另一个表中,并以一对一的关系将
MemberID
外键与之关联

例如:一个人可能有也可能没有电话号码,但电话号码必须属于一个人:

Member (1:1)-----------(0:1) Phone number
MemberId
是电话号码表中的外键和主键

作为一项规则,一个人只需在数据库中输入一个当时正在工作的号码,因此这不是一对多关系


我问这个问题的主要原因是列中的大多数值都是空的,所以我应该将它保留在表中,即使它有大多数空值(在10k记录中,我有4k值为空)

这个问题有几个答案,这取决于您真正想做什么

有时,一个包含大量空值的表会减慢处理速度。表示空值需要一两个字节,处理过程中还需要一些额外的步骤。有时,将两个表连接在一起会更慢。这里的答案是针对你的情况的

有时真正的悲伤来自SQL三值逻辑。这真的很难理解,尤其是如果你从小就学会了双值逻辑。3不等于NULL。3也不等于NULL。并且NULL不等于NULL。这很容易搞砸。但是,如果您能够保持原样,就可以在视图、过程或应用程序代码中编写适当的代码

有时,最好的数据管理方法是首先避免空值。我从来没有遇到过这种情况,我真的无法解释

有时,DBMS甚至会妨碍您。在Oracle中,长度为零的可变长度字符串存储为单个零字节。空值也存储为单个零字节。如果你需要区分这两种情况,那你就倒霉了

在一种情况下,空值几乎总是正确的选择,这就是可选关系。在这种情况下,正确的做法通常是在存在关系时,使用一个外键引用另一行(通常在另一个表中)的主键。当关系不存在时,外键将获得NULL


我知道这很清楚,但我希望它能有所帮助。

“我知道拆分表并保持简短是一种最佳做法”-不,规范化是关键,一个表可以用任意数量的列完全规范化。很常见的情况是,数据库的主要实体有50列或更多列。关键的方面是,这些属性是否属于实体。如果您有一个带有属性的1:N基数,那么它可能属于不同的实体(表)。如果基数是1:1(如电话),那么您可以决定预测在可预见的未来该基数是否会保持1:1(保留在表中),或者是否会更改为1:N(有一个单独的实体).@P.Salmon那么我应该使用空值拆分表,并且只向其中添加现有数据,还是保留列并接受空值存储成本较低。访问时间很重要。除非接近列限制,否则不要担心宽表。当大量信息是可选的时,具有1:1关系在特定情况下非常有用。更重要的是要有正确的索引,只查询您需要的数据。@我想知道,即使它有空值,我担心的原因是有10k条记录,其中约5k条记录有空值