MySQL 数据库规范化.. 一个 table 连接多个其他?
MySQL Database Normalization .. one table to connect multiple others?
假设我有一个非常大的数据库,其中包含大量 table。
其中某些 table 包含要相互连接的数据集,例如
table: album
table: artist
--> connected by table: album_artist
table: company
table: product
--> connected by table: company_product
table的album_artist
和company_product
包含3列代表主键,albumID/artistID同时companyID/productID...
做类似 "assoc" table 的事情是一个好习惯吗?
---------------------------------------------------------
| id int(11) primary | leftID | assocType | rightID |
|---------------------------------------------------------|
| 1 | 10 | company:product | 4 |
| 2 | 6 | company:product | 5 |
| 3 | 4 | album:artist | 10 |
---------------------------------------------------------
我不确定这是要走的路还是除了创建多个连接之外是否还有其他方法 tables?!
不,这不是一个好的做法。这是一种糟糕的做法,因为参照完整性超出了 window。参照完整性是 RDBMS 提供的保证,即一行中的外键引用另一行中的有效行 table。为了使数据库能够实施引用完整性,每个引用列必须引用一个且仅一个引用列的一个且仅一个引用列 table.
答案是"depends"就情况而言。就您和大多数其他人而言,不,这没有意义。如果您正在处理多 <-> 多关系,这确实有意义,可以通过 link table 使用外键和唯一约束来强制执行约束。如果您有多个 table 指向单个 table,那么最好的用例可能是。每个 table 可以有一个带有索引的 link table。如果 table 之一是一个大的 table,并且您需要单独获取 linked 记录,这将是有益的。
不不不,一千次不。不要过度考虑您的多对多关系。保持简单。试图在一个 table.
中巩固所有关系,没有任何收获,反而会失去很多
如果您之间存在多对多关系,比如 guiarist
和 drummer
,那么您需要一个包含两列的 guitarist_drummer
table:guitarist_id
和 drummer_id
。 table 的主键应该由两列组成。你应该有另一个由两列以相反顺序组成的索引。不要将带有自动增量 ID 的第三列添加到那些连接 table 中。这是一种浪费,它允许在那些 table 中出现重复的对,这通常会造成混淆。
在学校学过 RDBMS class 的人会立即认识到这些 table 是如何工作的。这很好,因为这意味着您不必在余生中成为该项目的唯一程序员。
专业提示:在所有地方都使用相同的列名。让您的 guitarist
table 包含一个名为 guitarist_id
而不是 id
的主键。它使你们的关系 table 更容易理解。而且,如果您使用像 Sql Developer 这样的逆向工程工具,该工具将更容易处理您的架构。
假设我有一个非常大的数据库,其中包含大量 table。 其中某些 table 包含要相互连接的数据集,例如
table: album
table: artist
--> connected by table: album_artist
table: company
table: product
--> connected by table: company_product
table的album_artist
和company_product
包含3列代表主键,albumID/artistID同时companyID/productID...
做类似 "assoc" table 的事情是一个好习惯吗?
---------------------------------------------------------
| id int(11) primary | leftID | assocType | rightID |
|---------------------------------------------------------|
| 1 | 10 | company:product | 4 |
| 2 | 6 | company:product | 5 |
| 3 | 4 | album:artist | 10 |
---------------------------------------------------------
我不确定这是要走的路还是除了创建多个连接之外是否还有其他方法 tables?!
不,这不是一个好的做法。这是一种糟糕的做法,因为参照完整性超出了 window。参照完整性是 RDBMS 提供的保证,即一行中的外键引用另一行中的有效行 table。为了使数据库能够实施引用完整性,每个引用列必须引用一个且仅一个引用列的一个且仅一个引用列 table.
答案是"depends"就情况而言。就您和大多数其他人而言,不,这没有意义。如果您正在处理多 <-> 多关系,这确实有意义,可以通过 link table 使用外键和唯一约束来强制执行约束。如果您有多个 table 指向单个 table,那么最好的用例可能是。每个 table 可以有一个带有索引的 link table。如果 table 之一是一个大的 table,并且您需要单独获取 linked 记录,这将是有益的。
不不不,一千次不。不要过度考虑您的多对多关系。保持简单。试图在一个 table.
中巩固所有关系,没有任何收获,反而会失去很多如果您之间存在多对多关系,比如 guiarist
和 drummer
,那么您需要一个包含两列的 guitarist_drummer
table:guitarist_id
和 drummer_id
。 table 的主键应该由两列组成。你应该有另一个由两列以相反顺序组成的索引。不要将带有自动增量 ID 的第三列添加到那些连接 table 中。这是一种浪费,它允许在那些 table 中出现重复的对,这通常会造成混淆。
在学校学过 RDBMS class 的人会立即认识到这些 table 是如何工作的。这很好,因为这意味着您不必在余生中成为该项目的唯一程序员。
专业提示:在所有地方都使用相同的列名。让您的 guitarist
table 包含一个名为 guitarist_id
而不是 id
的主键。它使你们的关系 table 更容易理解。而且,如果您使用像 Sql Developer 这样的逆向工程工具,该工具将更容易处理您的架构。