这张表破坏了什么规范化规则

Rah*_*sia 4 normalization relational-theory eav

我们以前的 DBA 受够了开发团队频繁请求更改数据库架构以添加和删除列的请求。然后他建议开发人员他将创建具有以下定义的简单表。

+---------------+---------+
| Record Number | VarChar |
+---------------+---------+
| Column Name   | VarChar |
+---------------+---------+
| Column Value  | VarChar |
+---------------+---------+
Run Code Online (Sandbox Code Playgroud)

因此,如果开发人员想要一个通常如下所示的表格

+-------------+---------------+-----------------+
| Employee ID | Employee Name | Employee Salary |
+-------------+---------------+-----------------+
| 0001        | John Doe      | 100000.00       |
+-------------+---------------+-----------------+
| 0002        | Jane Doe      | 110000.00       |
+-------------+---------------+-----------------+
| 0003        | Jack Doe      | 120000.00       |
+-------------+---------------+-----------------+
Run Code Online (Sandbox Code Playgroud)

他们可以按以下方式添加行

+---------------+-----------------+--------------+
| Record Number | Column Name     | Column Value |
+---------------+-----------------+--------------+
| 1             | Employee ID     | 0001         |
+---------------+-----------------+--------------+
| 1             | Employee Name   | John Doe     |
+---------------+-----------------+--------------+
| 1             | Employee Salary | 100000.00    |
+---------------+-----------------+--------------+
| 2             | Employee ID     | 0002         |
+---------------+-----------------+--------------+
| 2             | Employee Name   | Jane Doe     |
+---------------+-----------------+--------------+
| 2             | Employee Salary | 110000.00    |
+---------------+-----------------+--------------+
| 3             | Employee ID     | 0003         |
+---------------+-----------------+--------------+
| 3             | Employee Name   | Jack Doe     |
+---------------+-----------------+--------------+
| 3             | Employee Salary | 120000.00    |
+---------------+-----------------+--------------+
Run Code Online (Sandbox Code Playgroud)

这显然不符合气味测试,并且让我想分析这种设置会破坏什么数据库规范化

这会破坏1NF吗?2NF ? 3NF ? BCNF ? 解释会很好。

Dav*_*oft 6

这是一个可怕的模式,但它实际上并没有违反任何规范化规则。原因是它实际上您正在建模的内容的更改。它不是您的数据库建模,例如员工,而是实体、属性和值建模。

  • 我不一定会称它为“一种可怕的模式”,因为它使用了它(https://sqlblog.org/2009/11/19/what-is-so-bad-about-eav-anyway) (2认同)
  • eav 使用起来真的很不方便,如果您的数据库支持自由格式的结构化类型,如 XML 或 JSON,请使用其中之一并在每一行中放置一个实体, (2认同)