2017-05-26 56 views
-1

我们假设我有一个非常大的数据库,里面有大量的表。 某些这些表包含的数据集将被连接到彼此像MySQL数据库规范化..一个表连接多个其他?

table: album 
table: artist 
--> connected by table: album_artist 

table: company 
table: product 
--> connected by table: company_product 

的表格album_artistcompany_product包含表示主键3列,ALBUMID/artistID同时companyID/...的productID

它是一个很好的做法,这样做它是由像

--------------------------------------------------------- 
| id int(11) primary | leftID | assocType  | rightID | 
|---------------------------------------------------------| 
| 1     | 10  | company:product | 4  | 
| 2     | 6  | company:product | 5  | 
| 3     | 4  | album:artist | 10  | 
--------------------------------------------------------- 

的“assoc命令”表中,我不知道这是要走的路,或者有什么比创建含多处别的e连接表?

+1

_然后一个戒指规则然后所有_ – RiggsFolly

+2

这听起来对我来说是一个非常糟糕的主意。创建特定的连接表有什么问题? – Uueerdo

+0

你说“如果这是要走的路”,但除了“像这样的例子”之外没有“this”,你没有解释“this”是什么,或者你的例子是一个例子* of *请尽可能多地解释你认为你想做什么以及为什么你认为你应该这样做。另外,您不清楚“创建多个连接表”的含义 - 是否要创建像“album_artist和company_product”这样的表? (虽然再次,你没有清楚地解释这些是什么。)请*解释*,不要只用几个字提醒你你的意思,但不是说。 – philipxy

回答

1

不,没有,一千次没有。不要超越你的多对多关系。保持简单。试图将所有关系整合到一张表中,没有什么可以获得,并且会失去很多。

如果你有很多之间一对多的关系,说guiaristdrummer,那么你需要一个guitarist_drummer表带有两个列:guitarist_iddrummer_id。该表的主键应由两列组成。而且你应该有相反顺序的两列组成的另一个索引。不要将具有自动添加ID的第三列添加到这些连接表中。这太浪费了,它允许在这些表格中使用重复的对,这通常是令人困惑的。

在学校参加RDBMS班的人会立即认识到这些表的作用。这很好,因为这意味着你不必成为这个项目中唯一的程序员。

专业提示:随处使用相同的列名。使您的guitarist表包含名为guitarist_id而不是id的主键。它使你的关系表更易于理解。而且,如果你使用了像Sql Developer这样的反向工程工具,那么这个工具将会让你的模式更容易。

4

不,这不是一个好习惯。这是一种可怕的做法,因为参照完整性就会消失。参照完整性是RDBMS提供的保证,即一行中的外键引用另一个表中的有效行。为了使数据库能够强制引用完整性,每个引用列必须引用一个且仅有的一个引用表中的一个引用列。

+0

@philipxy恐怕我不明白你想说什么。你能说出其他地方吗?你会怎么说句子呢? –

+1

我同意对于给定的FK,“每个引用的列必须引用一个且只有一个引用的列中的一个并且只有一个引用表”。我错误地认为应该为引用列声明一些FK(s)。 – philipxy

0

答案是它“依赖于”情况。在你的情况和大多数其他人,不,这是没有意义的。如果你正在做很多关系,那么这个约束可以通过带有外键的链接表和一个唯一约束来强制执行。如果你有很多表格指向单个表格,最好的用例可能是。每个表都可以有一个带有索引的链接表。如果其中一个表是一个大表,并且您需要单独获取链接的记录,这将是有益的。