sql - 这些数据库设计风格(或反模式)有名字吗?

标签 sql design-patterns database-design anti-patterns

考虑一个包含表 Products 和 Employees 的数据库。对当前产品经理建模有一个新要求,即负责产品的唯一员工,并指出某些产品足够简单或成熟,不需要产品经理。也就是说,每个产品可以有零个或一个产品经理。

方法一:修改表Product添加一个新的 NULL能列product_manager_employee_ID所以没有产品经理的产品由 NULL 建模值(value)。

方法二:新建表ProductManagers与非 NULL能列product_IDemployee_ID ,对 product_ID 具有唯一约束,因此没有产品经理的产品通过此表中缺少行来建模。

还有其他方法,但这些是我似乎最常遇到的两种。

假设这些都是合法的设计选择(正如我倾向于相信的那样)并且仅代表不同的风格,它们有名字吗?我更喜欢方法 2,并且发现很难在不使用实际示例的情况下向喜欢方法 1 的人传达风格上的差异(就像我在这里所做的那样!)如果我能说,“我更喜欢我自己倾向于 6NF(或其他)风格。”

假设这些方法之一实际上是一种反模式(我只是怀疑方法 1 可能是这种情况,方法是将两个实体之间的关系建模为其中一个实体的属性)这种反模式有名字吗?

最佳答案

嗯,第一个只不过是一对多的关系(一个员工对许多产品)。这有时被称为 O:M 关系(从零到多),因为它是可选的(并非每个产品都有产品经理)。也不是每个员工都是产品经理,所以在另一边也是可选的。

第二个是连接表,通常用于多对多关系。但由于一侧只是一对一(每个产品只在表中出现一次),因此它实际上只是一种复杂的一对多关系。

我个人更喜欢第一个,但都没有错(或不好)。

出于想到的两个原因,将使用第二个。

  • 您设想一种产品可能有多个经理;或
  • 您想跟踪产品经理是谁的历史记录。你这样做,比如说一个 current_flag 列设置为“Y”(或类似的),其中一次只能有一个是当前的。这实际上是以数据库为中心的应用程序中非常常见的模式。
  • 关于sql - 这些数据库设计风格(或反模式)有名字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/954988/

    相关文章:

    mysql - 如何在MySQL存储过程中设置变量作为查询结果?

    SQL 查询 - 返回连接表的前两条记录的连接

    android - 如何在 Android 应用程序中添加和打开 sqlite 文件?

    javascript - 如何使 javascript 库在 Node js 中工作以进行服务器端操作

    database-design - 数据库设计最佳实践-订单处理数据库-产品更新可有效更改已关闭发票的位置

    php - Cakephp 中的 UNION 语法

    java - 在 Java 中避免空值的好的轻量级设计模式是什么?

    objective-c - 用于 UI 主题的 iOS/Objective-C 设计模式

    php - 商店时间表的数据库架构

    mysql - 这个Mysql条件连接可能吗?