【问题标题】:Relational database Design- Relationship problem关系数据库设计-关系问题
【发布时间】:2010-06-28 10:21:09
【问题描述】:

我需要创建数据库表来存储备忘录。在“To”子句中,用户可以选择单个员工或员工组(不同的组已经在与员工有多对多关系的数据库中可用)。我想知道表的结构应该是什么。 对于没有组的简单备忘录,我将拥有“MemoMasters”和“Memodetails”,其中 memodetail 具有 EmployeeID 作为外键。我如何在这个结构中嵌入组

问候

【问题讨论】:

  • 我还需要存储每个员工的确认信息

标签: database database-design one-to-many relational-database


【解决方案1】:

只要您将其作为关系建模任务来处理,我看不出它的复杂性。假设你想要一个纯关系解决方案,试试这个Memo Data Model。如果您不熟悉关系数据库建模标准,IDEF1X Notation 可能会有所帮助。

  1. 它使用普通的超类型-子类型结构。

    • 在这种情况下它是独占的:MemoAddress 即 either 和 EmployeeAddress GroupAddress。

    • 独占子类型需要超类型中的鉴别器:我使用了布尔值IsEmployee,CHAR 代码或类似代码也很常见。

  2. 这是纯 5NF;没有更新异常;完整的声明性引用完整性。

  3. Ack 在正确的位置(我使用了 DateTime,但布尔值也可以)。

  4. 如果您不习惯,填充超类型-子类型结构的投影可能看起来很难看;只需询问您是否需要帮助。

  5. 不要区别对待“一个员工的简单备忘录”,你会遇到问题、重复代码等。

  6. 另一个问题是,您可能需要Employee 中的EmployeeId Employee,后者编写 Memo,这是另一回事,为此您确实需要一个FK for Employee in Memo

【讨论】:

  • 这给了我另一种看待问题的方式。虽然我实现了一些非规范化的解决方案:(但我肯定会再次研究它。我还有另一个与数据库有关的问题,请您在这里详细说明stackoverflow.com/questions/4409003/…
  • @Tassadaque。谢谢。完毕。请投票。
【解决方案2】:

在这种结构中你不能。

这是一个many to many 关系,这样建模。

编辑(查看场景): 上述要求不足以确定“确切解决方案”

冒着过度简化的风险,您应该:

1) 检查您是否可以将新信息粘贴到任何现有表/实体中
2) 如果没有,则检查是否将属性/列添加到任何现有表/实体
3)如果没有,则添加一个新表

决策永远不会明确地做出,您应该考虑几种情况及其后果。您还应该定期检查您的模型,因为它正在寻找机会对其进行规范化,因为它会极大地影响您系统的整体功能。

因此,例如,当您声明您已经有一个用于组的多对多表时,现在的主要问题是重用该表或创建一个新表的天气。

这取决于此表中的其他属性。也许对于您的业务模型/用例来说它是有意义的,也许它没有。

也许您需要为一个名为“MemoRecipients”的表建模,该表将存储有关收件人的信息(交付、确认等...)。然后你应该问问自己你是否需要所有这些状态的时间等等......

只有您才能确定适合您的问题空间的设计决策。

【讨论】:

  • 我知道这是多对多的关系,但请查看它有点复杂的场景
  • @Tassadaque,已审核并更新。不幸的是,答案只能是建议和建议的形式。
【解决方案3】:

似乎您需要继承层次结构来实现您所描述的。考虑下图:

在此图中,您创建了一个父表(我称之为海报),员工表和组表是子表。您必须给员工表和组表提供相同的主键,即组与海报、员工与海报之间存在一对一的链接。

这样,memo 的 poster_id 字段就指向了超类。您可以在海报、组和员工之间执行连接,以确定您指的是员工还是组。

我在图中省略了员工和组之间的关系,正如你所说的那样。

请注意,这只是说明可能的情况,您的解决方案可能会有所不同。

【讨论】:

  • 感谢您的良好回复,但这种方法似乎存在一个问题。如果团队和员工 deos 没有直接关系但员工和团队有多对多关系,那么您提出的方法可以正常工作。正如我之前提到的,我需要为每个员工存储确认信息,无论他是否属于组。在上述情况下将如何处理 ack。如果我错了,请纠正我
  • 由于员工和组之间的关系是多对多的,那么您将创建一个关系来表示这一点。让我们称之为employee_group。这将照顾你的多对多。这仍然适用于上述设计。你能再解释一下致谢吗?
  • Ack 表示每个属于或不属于组的员工都必须承认他已收到备忘录。它是一个布尔字段。此字段是与您提议的案例中的海报链接的备忘录的一部分。所以 ack 将被存储在上图中的组中
猜你喜欢
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多