Database design 多对多关系与否?

Database design 多对多关系与否?,database-design,Database Design,我在试图定义3个表之间的关系类型时遇到了一些麻烦。 它们是产品,供应商,第三个是数量,我有一个产品和供应商的组合,还有一个存储该组合产品数量的字段 我可以从一个或多个供应商处获得一种产品,这就是为什么存在表数量。例:我可以从供应商X和供应商Y处购买相同的笔记本A 表数量包含字段prod\U id、SUPPI\U id和qty。产品和供应商都有一个ID字段。我搞不懂,所以我向比我聪明的人寻求一些帮助,也就是说你们大家D 非常感谢 [编辑] 很抱歉,我应该从一开始就说清楚。这是关于模特的D您似乎对具

我在试图定义3个表之间的关系类型时遇到了一些麻烦。 它们是产品,供应商,第三个是数量,我有一个产品和供应商的组合,还有一个存储该组合产品数量的字段

我可以从一个或多个供应商处获得一种产品,这就是为什么存在表数量。例:我可以从供应商X和供应商Y处购买相同的笔记本A

表数量包含字段prod\U id、SUPPI\U id和qty。产品和供应商都有一个ID字段。我搞不懂,所以我向比我聪明的人寻求一些帮助,也就是说你们大家D

非常感谢

[编辑]


很抱歉,我应该从一开始就说清楚。这是关于模特的D

您似乎对具有附加属性的实体之间的关系感到困惑。
我同意这是相当罕见的,但它并没有什么无效之处,而且你似乎在正确地建模。

你的帖子中描述的情况似乎回答了你提出的任何问题。也就是说,你在问题中陈述了问题的正确解决方案

表产品将具有字段id(我更喜欢称之为prop_id,但这只是我自己)。供应商将拥有id(或者,在我的世界里,供应商id)。表数量将具有(项目id、供应商id和数量)

理想情况下,产品中的prop_id将作为主键或唯一索引进行保护。与供应商中的supp_id相同。在数量上,您将在prop_id和supp_id的组合上创建一个主键或唯一索引(因为每个组合只应出现一次,即使单独考虑的每个列可能有重复项)


最后,我通常希望每个表上都有一个单列整数主键,因此(如果是我,其他人不同意),我会将(prop_id,supp_id)创建一个唯一的索引,并在quantity表中创建一个新的主键列quantity_id。

既然您询问了关系,这里有一些更多的信息可能会有所帮助。多对多表存在于设计级别(概念),但通过构建两个一对多关系在数据库中构建


虽然您不必这样做,但您可能应该声明quantity.supp_id是来自供应商的外键,以建立供应商与数量之间的一对多关系;并声明products.prod_id是products的外键,建立了从产品到数量的一对多关系。这样做可以帮助数据库优化查询。它还允许您设置级联删除,以便从供应商表中删除供应商时,也会自动删除该供应商在数量表中的所有记录(如果您希望这样做)。

那么,您的问题是什么?!这个数量实际上是一个不断变化的值。货物进来时价格上涨,销售出去时价格下跌。您的设计只保留一个值。是否有其他地方的事务表可以从中进行聚合?@rahim:8D已编辑@史蒂芬妮:有一张交易表,是的。无论何时货物进出,PHP代码都会更新QUANTITY表。还有地位的问题。可以禁用或启用事务(输入或输出)。在这两种情况下,此表都会更新。例如,如果禁用了产品X和供应商Y的4项进货,那么我们必须从具有此组合的数量行中减去4。为什么?为什么您希望每个表上都有一个单列PK?它有什么用途?对我来说,这是一个纯粹的情感/愚蠢的一致性概念。如果一个表是父表,它需要一个PK,这个PK最容易作为一个列来管理。如果它不是一个父级,比如映射表,为什么要用一个无用的数字构建一个无用的列并维护一个无用的索引呢?我喜欢在每个表上都有一个单独的列PK,因为在编写用户界面时,通常更容易使用单个值来唯一地标识每一行。在桌面程序中,通常可以为ListView控件中的每个项附加一个整数值,这样,当用户从几个半重复项中选择一项并单击“删除”时,就可以轻松地知道必须删除哪一行。类似地,在编写web界面时,这样可以省去将唯一标识行的多列编码和解码到标识符中的麻烦。@Stephanie-大多数数据库纯粹主义者都会同意您的观点。尽可能使用自然关键点。然而,许多数据库工具需要(或者至少更好地使用)标识列。很高兴知道我们想法相同。我没有为此表创建PK,因为product and supplier的where子句听起来是一个对我来说足够简单的解决方案。谢谢你的回答。@Mystere,伙计,这是真的。你的回答让我意识到我犯了一个错误,就是不清楚这个问题是否是关于模特的,第一段启发了我。非常感谢。