具有多个多对多关系的数据库设计

时间:2010-11-02 12:51:57

标签: database database-design many-to-many entity-relationship foreign-key-relationship

我正在设计一个数据库,我需要以下实体:

Manufacturers: e.g. CocaCola
Brands: e.g. Diet Coke, Coke Zero
Continents: e.g. North America, Europe
Territories: e.g. United States, Canada
Regions: e.g. Alaska, California, Quebec
Suppliers

供应商位于一个且仅属于一个区域内,该区域属于属于大陆的区域。

A Brand属于制造商。

供应商,地区,地区和大陆属于至少1个但可能更多的品牌。

我无法想象如何组织表格之间的关系,以便供应商可以按品牌或制造商进行分组,而不会导致在供应商拥有多个品牌时,在单个制造商下将重复项包含在聚合计算中。当我试图考虑将区域添加到该等式中时,我更加困惑,更不用说Territory或Continent。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

这没什么不对。您可以在两个实体之间建立多个关系。只需根据需要定义尽可能多的外键和链接表。

而且,正如Flinsch指出的那样,在你的情况下,它甚至更简单:你实际上只有一对多的关系,因此你不需要任何链接表。

<强>更新即可。要确定不同的关系,请考虑“所属”一词的商业含义。品牌可以属于该地区,因为“这个品牌由加利福尼亚制造商拥有”,并且“该品牌用于在阿拉斯加销售商品”。 这是两种不同的一对多关系,而不是一对多关系。

更新2 。多对多的有效示例是“允许用户读取多个文件,并且每个文件可以具有多个具有'读取'访问级别的用户”。

HTH

答案 1 :(得分:1)

制造商 - &gt;品牌 - &gt;大陆 - &gt;地区 - &gt;地区 - &gt;供应商 正确?

因此以下外键:

Brand contains ManufacturerId
Continent contains BrandId 
Territory contains ContinentId 
Region contains TerritoryId 
Supplier contains RegionId 

例如,如果许多大陆拥有相同的品牌,则需要一个关系表:

Brand (id, more fields)
BrandToContinent (BrandId, ContinentId) = many to many
Continent (id, more info)

或者您可能需要将品牌或供应商连接到许多地区或大陆,而不是根据需要随意添加更多外键引用!

答案 2 :(得分:0)

多对多关系不存在,通常是无法理解数据库结构应该如何的结果。

从你告诉我的情况来看,听起来像是关系:

One continent -> Many Regions
One region -> Many territories
One territory -> Many suppliers
One manufacturer -> One brand
One brand -> Many suppliers
One brand -> Many regions
One brand -> Many territories
One brand -> Many continents

如您所见,所有关系都是一对多或一对一。试图在表之间“跳”会导致看似“多对多”的关系,但这种关系无法正确表达。我只列出了你从你写的东西中收集到的关系,但我相信你能想到别人。请记住,对于任何给定的表,您可以拥有尽可能多的一对多和一对一的关系。你不可能有一个“多对多”的关系。