【问题标题】:Database design for one-to-one relationship一对一关系的数据库设计
【发布时间】:2014-11-06 03:08:57
【问题描述】:

我有以下表格: 1) 事件 2) 议程 3) Registrant_Type 4) 费用

关系: 事件到议程:一对多(一个事件由零个、一个或多个议程组成;一个议程只属于一个事件)

Event to Registrant_Type:一对多(一个事件由零个、一个或多个注册者类型组成;一个注册者类型只属于一个事件)

Event to Fee:一对一(一场赛事只包含一笔费用(注册费))

Agenda to Fee:一对一(一个议程仅包含一项费用(议程费))

Registrant_Type to Fee:一对一(一种注册人类型只包含一种费用(注册费))

如何根据这些关系创建表?

【问题讨论】:

  • 您真的需要费用表吗?它不只是一个数字,您可以在每个有费用的表格中放入一列吗?费用还有哪些其他属性表明它应该在表格中?
  • @BarmarInside 费用表,我有 Pricing_Schedule 属性(早鸟价、迟到价等)。此外,我还有一个与费用表相关的 Discount_Code 表。 Fee和Discount_Code的关系是:一对多(一个Fee由多个折扣码组成,一个折扣码只属于一种费用)。
  • @Barmar Inside Fee 表,我有 Pricing_Schedule 属性(早鸟价、迟到价等)。此外,我还有一个与费用表相关的 Discount_Code 表。 Fee和Discount_Code的关系是:一对多(一个Fee由多个折扣码组成,一个折扣码只属于一种费用)。
  • 您可以将 1:1 的两个端点放在同一个表中,也可以使用单独的表,“标准”解决方案是单个表。更多信息here.

标签: mysql database-design relational-database mysql-workbench


【解决方案1】:

在议程中为事件添加外键。在 registrant_type 中放置事件的外键。

对于一对一的关系,您有两个可行的选择:

  1. 在事件、议程和 registrant_type 中添加付费外键。

这会起作用,但不会强制执行关系所具有的规则 是 1:1 而不是 1:many。如果您想执行该规则, 您需要在您的应用程序中或使用触发器来执行此操作。

  1. 使用 event、agenda 和 registrant_type 中的主键作为外键付费。

这会强制执行 1:1 关系,因为 PK 不能有重复值。您的费用 PK 可能会自动增加,但您必须手动在其他表中设置 PK 以对应费用中的匹配记录。如果您不能先​​将费用添加到数据库中(例如,如果您先创建事件,然后再决定费用是多少),这将无法正常工作。

【讨论】:

    猜你喜欢
    • 2015-08-05
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    相关资源
    最近更新 更多