数据库规范化与数据识别器

时间:2013-07-01 19:34:38

标签: mysql database database-design database-normalization

我对数据库规范化有一些了解,但有时候我认为,在某些情况下,有一个比一个数据对象=一个表格模式更优雅的解决方案(我相信)。

例如:存储文章和静态页面。数据非常相似,我们可以使用一个简单的识别器列将它们放在一个表中,并且由于不同,我们实际存储的数据不同,每种数据类型都会有一些空白的未使用的cols:

id | title(both) | author(article only) | content(both) | datetime(article only) | type(identificator - article/page)

这种方法是否仍然正确,或者无论相似性如何,每个数据都应该有表格?

1 个答案:

答案 0 :(得分:1)

您正在描述单表继承。这是一种合法的模式,请参阅http://martinfowler.com/eaaCatalog/singleTableInheritance.html

优点包括:

  • 一个表包含所有子类型。

缺点包括:

  • 您不能在特定于子类型的列上定义NOT NULL约束,因为它们必须是可为空的。
  • 可能不支持
  • UNIQUEFOREIGN KEY对特定于子类型的列的约束(取决于RDBMS实现)。
  • 如果您有许多子类型,表格将包含很多列,其中大部分都是NULL。某些数据库对给定表的列数有限制。但是在MySQL的情况下,每个表的最大列数是4096.InnoDB不存储NULL,所以这应该不是问题。
  • 如果经常添加新的子类型,则每次添加更多特定于子类型的列时,都必须更改表格。

您可能想要了解替代方法,例如类表继承(http://martinfowler.com/eaaCatalog/classTableInheritance.html)。