SQL多对多关系3种方式

时间:2016-08-30 10:28:00

标签: mysql sql database many-to-many relationship

Hej all,

  

假设我有4个名为“user”,“office”,“product”,“event”的表。   另一个名为“文档”的表。可以分配相同的文档   一个或多个用户,办公室,产品和活动。所以我们需要一个   多对多的关系。但我有3种方法可以做到这一点:

     

- 一个名为“user_document”的表,另一个名为“office_document”,“product_document”和“event_document”的表都有一个名为   “document_id”,它是文档ID和另一个字段的外键   “user_id”(对于user_document),它是用户id的外键(等等)   当然还有办公室,产品和活动......)

     

OR

     

- 名为“document_ownership”的表,其中包含以下字段:“document_id”,“user_id”,“office_id”,“product_id”和“event_id”。   这里document_id应该不是Null和一个(或多个)其他字段   这可能是空的。例如,如果我为用户设置了相同的文档   一个产品,我将有一行document_id,user_id和product_id   不是空的。

     

OR

     

- 一个名为“document_ownership”的表,它将包含以下字段:“document_id”,“relation_type”和“relation_id”。这里是relation_type   字段例如是字符串(表示关系表)   name)或指向另一个为其命名的附加表的外键   例如“relationtype”,其中我们有像“user”(id = 1)这样的字符串,   “office”(id = 2),“product”(id = 3)和“event”(id = 4)(也是   表示关系表名称),relation_id表示id   指定的关系表(relation_type)

我的问题是,所有这3种做我想做的方式的利弊是什么,最佳做法应该是什么?

提前感谢您的建议,

米甲

2 个答案:

答案 0 :(得分:1)

这个问题实际上并没有得到回答。纯粹主义者会说方法1是正确的,但并不总是这么简单。可以这样想 - 您的数据库设计应表达数据与数据含义之间的关系。因此,您的每种方法都意味着有关数据性质的几个方面。

方法1说用户,办公室,产品和活动很重要,哦,是的,他们可以有文件。也许

方法2说文档很重要,我们需要跟踪每个文档的相关内容。因此,文档是关键的事情,其他一切都是围绕着这个。

方法3更加复杂和技术性,并没有真正了解您希望如何使用数据。

在所有情况下,数据都是相同的。它只是设计数据来讲述它应该如何使用的故事。

抱歉抒情。只需我0.02美元。

答案 1 :(得分:0)

在数据概念(Merise)视图中,您有:

文献-0,N 0 ---------,正用户

文献-0,N 0 ---------,正事件 ...

这是逻辑观点。

当您将其转换为物理数据视图时,每个关系最终会有1个表。

因此,如果您想在数据模型中应用最佳实践,那么第一种解决方案就是可行的方法。

关于另外两个破坏正常形式的解决方案:

  • 第二个解决方案是完全不行。你到处都会有很多空值,并且会因此而采取一些基本的统计数据。
  • 第三个解决方案,看起来像一个spaghetthi板,将在全球范围内工作,并且在我看来,是一个很好的选择。如果你能处理约束完整性的损失