Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 具有多对多关系的数据库设计_Database_Database Design_Many To Many_Entity Relationship_Foreign Key Relationship - Fatal编程技术网

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

Database 具有多对多关系的数据库设计,database,database-design,many-to-many,entity-relationship,foreign-key-relationship,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 制造商:例如可口可乐 品牌:如健怡可乐、零度可乐 大陆:如北美、欧洲 地区:

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

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 制造商:例如可口可乐 品牌:如健怡可乐、零度可乐 大陆:如北美、欧洲 地区:如美国、加拿大 地区:如阿拉斯加、加利福尼亚、魁北克 供应商 供应商位于一个区域内,且仅位于一个区域内,该区域属于一个区域,属于一个大陆

品牌属于制造商

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

我无法想象如何组织表格之间的关系,以便供应商可以按品牌或制造商进行分组,而不会导致当供应商在一个制造商下拥有多个品牌时,在合计计算中包含重复项。当我试图把地区加入到这个等式中时,我会更加困惑,更不用说领土或大陆了


在此方面的任何帮助都将不胜感激。

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

而且,正如Flinsch所指出的,在您的例子中更简单:实际上您只有一对多的关系,因此不需要任何链接表

更新。要确定不同的关系,请思考“归属”一词的商业含义。该品牌可以属于该地区,如“该品牌归加利福尼亚制造商所有”和“该品牌用于在阿拉斯加销售商品”。 这是两种不同的一对多关系,而不是一对多关系

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


HTH

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

根据你告诉我的,在我看来,关系是:

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

如您所见,所有关系都是一对多或一对一。尝试在表之间“跳转”将导致看似“多对多”的关系,但无法正确表示。我只列出了我从你的文章中收集到的关系,但我相信你可以想到其他的关系。请记住,对于任何给定的表,您可以有任意多个一对多和一对一的关系。你不能有“多对多”的关系。

制造商->品牌->大陆->地区->地区->供应商 对吧?

因此,以下外键:

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)

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

据我所知,你没有多对多的关系。我看到层次结构,因此,一对多的关系。对不起,我认为这是我解释的错误。如我所见,如果一个区域属于两个品牌,则存在多对多关系,否则我需要在Regions表中复制该区域?我认为这同样适用于供应商、地区和大陆。谢谢你的帮助。:-)不,那不是真的。如果地区属于两个品牌,品牌表中的两行将具有相同的地区id。我仍然认为这里有多对多,作为一个地区->多个品牌,供应商、地区和大陆也是如此。但我可能错了……总是一个地区对多个品牌,一个地区对多个供应商,等等。例如,你找不到供应商和地区之间的关系,因为一个供应商可能有多个地区,一个地区可能有多个供应商。供应商和地区之间存在一对一的关系,由于供应商有1个地区,即其所在的地区。您没有指定,我假设该供应商可能有许多地区(工厂)。对不起,这是我的错误,我已经更新了最初的帖子。谢谢你的帮助。一个品牌可以有多个地区,但一个地区也可以属于多个品牌,一种多对多的关系吗?这就是我所想的,但这让我想到,我需要品牌和每个大陆、地区、地区和供应商之间的链接表,这在某种程度上对我来说是错误的。