mysql - 数据库规范化与数据标识符

标签 mysql database database-design database-normalization

我确实对数据库规范化有一些想法,但有时我认为,在某些情况下,有比 ONE DATA OBJECT = ONE TABLE 模式更优雅的解决方案(我相信)。

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

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

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

最佳答案

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

优点包括:

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

缺点包括:

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

您可能想阅读替代方案,例如类表继承 (http://martinfowler.com/eaaCatalog/classTableInheritance.html)。

关于mysql - 数据库规范化与数据标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17412276/

相关文章:

php - Mysql从数组中插入数据到多个表中

database - PostgreSQL 如何查看运行了哪些查询

database - 您将使用@OneToOne 关系的具体示例?

Php 简单错误

mysql - 如何将hibernate查询转换为sql

MySQL:UNION 是我要找的吗? (将行分解为多行返回)

android - 如何使用 ADB 从 android 设备中提取 sqlite 数据库?

mysql - 我的数据库模型的有效性

.net - 决定我是否应该拆分表格

php - 给定的每一行必须为空或带有谷歌图表线的数组