【问题标题】:Should a many-to-many relationship define anything other than the relationship多对多关系是否应该定义关系以外的任何内容
【发布时间】:2010-11-10 23:13:38
【问题描述】:

采用典型的产品/类别多对多关系,您通常会有如下关系:

table -- ProductsCategories
column - ProductId
column - CategoryId

是否不建议将其他属性添加到该关系中,这些属性仅存在于该特定关系中。如(请原谅我的糟糕例子,我不擅长例子):

table -- ProductsCategories
column - ProductId
column - CategoryId
column - DiscountForProductsInThisCategory
column - CategoryImageForProductsInThisCategory

【问题讨论】:

    标签: database-design


    【解决方案1】:

    多对多关系只是一个具有 2 个一对多关系的表,将其视为具有 2 个关系的 3 个表,而不是 2 个具有关系和与之关联的数据的表。实现上没有区别。

    无论哪种方式都是完全可以接受的。

    【讨论】:

      【解决方案2】:

      除非数据专门针对该特定关系,否则请避免这种情况,因为您最终会复制大量数据。在您的示例中,图像链接到类别,因此应该存储在那里。但是,指示建立和编辑关系的时间戳以及创建和修改关系的用户 ID 应该在该表中。

      【讨论】:

      • 同意,我将使用 CategoryID 加入包含类别中产品折扣的表,因为它与类别相关,而不是类别和产品之间的关系。添加时间戳与关系有关。
      【解决方案3】:

      当然,您可以在此处存储此信息。其他任何地方都不会被标准化。

      【讨论】:

      • +1:还有“高阶”关系。 3 向关系,例如,中间表有 2 个以上的 FK,并且可能还具有属性。
      • +1 也是。如果这些属性依赖于两个(或多个)外键的唯一交集,那么它就是适合它们的地方。
      • 这两个字段可以存储在类别表中,同时仍被规范化。它们的名字是“x...InThisCategory”,因此它们与类别相关。它们与“关系”本身无关。
      • Em,这里给出的特定示例不正确。缺乏规范化和大量重复。
      【解决方案4】:

      例如,如果您有一张运动员表和一张比赛表。连接表 AthleteRace 代表该运动员参加了那场比赛,因此您也可以在其中获得他们的比赛时间。

      你有两个例子:

      column - DiscountForProductsInThisCategory
      column - CategoryImageForProductsInThisCategory
      

      属于类别表,因为它们与类别相关,而不是与类别中产品的成员资格相关。

      【讨论】:

      • 谢谢,那会是一个更好的例子。我很不擅长提出适当的例子。
      【解决方案5】:

      这个问题不是要考虑的问题。

      如果是列,例如。 DiscountForProductsInThisCategory 是 1::1 与 Category 的 PK,那么它唯一正确的位置是 Category。在 ProductCategory 中,这将是大量的数据重复。

      如果一列与关系 (ProductId+CategoryId) 是 1::1,那么它的唯一正确位置是 ProductCategory。

      【讨论】:

        【解决方案6】:

        是的。

        关系可以有属性,IMO。虽然有些设计大师不这么认为。

        考虑学生和课程之间的“已注册”关系。如果学生可以注册获得学分或成为审计员,则将此属性存储在其键为 (StudentID, CourseID) 的表中是有意义的。该表是对哪些学生注册了哪些课程进行编目的关系表。

        【讨论】:

          【解决方案7】:

          我认为将其他字段添加到此表中是完全可以的。我所做的一个例子是我通常添加一个时间戳字段,以便我知道两个实体之间的关系何时创建。

          【讨论】:

            猜你喜欢
            • 2013-11-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-02-09
            • 2023-02-02
            • 1970-01-01
            相关资源
            最近更新 更多