我何时以及为什么要为只接受预定列表中的值的属性创建表?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我何时以及为什么要为只接受预定列表中的值的属性创建表?相关的知识,希望对你有一定的参考价值。

我试着寻找明确的答案,但不能。

每次创建新数据库时,我都会为Marital Status和Gender等特定属性创建辅助表。这样在Customer表上,我只需在Marital Status列上放置一个ID。 1 - 单身2 - 离婚3 - 结婚

等等...

我一直这样做,这是我学习它的方式,我知道这是好习惯等等。但是为什么这样做有更好的“论据”或事实?

基本上,我合作的人想要构建一个新数据库并使Customer_Type成为一个文本字段,而不将其链接到另一个表,我想解释为什么这是不好的做法。

谢谢

答案

这是不好的做法,因为您不能将文本列限制为仅保留有效值。例如,你可以把'土豆'的性别。另一个原因是文本列将占用比链接到辅助表的int列更多的空间。这意味着该表将占用磁盘上较少的空间,并且行将更易于缓存。此外,索引整数列可能比索引文本列更快,具体取决于文本值的长度。

但是,在mysql中,您可以创建仅具有有效值的枚举列。

另一答案

正如@Swoogan正确描述的那样,将genderstatus和类似类型的字段声明为varchar是一种不好的做法,因为数据健全性将受到阻碍。

或者我们可以把它们enum。枚举数据类型在数据库中显示为文本,但更有效地存储,并且仅允许来自创建表时提到的特定可枚举值的值,例如在('male', 'female', 'others')的情况下gender

gender enum('male', 'female', 'others')

您还可以为所有可能的性别创建单独的表,并将字段gender_id指定为您在问题中提到的外键。这是一个理想的场景,但前者是问题的非规范化解决方案,否则您需要每次都需要加入以找到性别的价值。

以上是关于我何时以及为什么要为只接受预定列表中的值的属性创建表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 plist 中添加预定义值?

如何检查用户何时更改选择下拉列表的值?

Yii2 中的 $with 和 $joinWith 有啥区别以及何时使用它们?

AngularJS 根据预定义的值更改 SELECT 列表中的选定选项

如何判断 textarea 中的一行何时创建/删除?

在 2D 矢量中的预定位置更改多个值的最简单方法是啥?