代码之家  ›  专栏  ›  技术社区  ›  onedaywhen

这些数据库设计样式(或反模式)是否有名称?

  •  8
  • onedaywhen  · 技术社区  · 17 年前

    考虑一个包含表产品和雇员的数据库。有一个新的要求是对当前的产品经理进行建模,作为负责产品的唯一员工,注意到有些产品非常简单或成熟,不需要产品经理。也就是说,每个产品可以有零个或一个产品经理。

    方法1:更改表 Product 添加新的 NULL 能级柱 product_manager_employee_ID 因此,没有产品管理器的产品由 无效的 价值。

    方法2:创建新表 ProductManagers 与非 无效的 可列 product_ID employee_ID ,对 产品标识 ,使没有产品管理器的产品在此表中缺少行来建模。

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

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

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

    5 回复  |  直到 17 年前
        1
  •  9
  •   cletus    17 年前

    好吧,第一个就是一对多的关系(一个员工对许多产品)。这有时被称为O:M关系(零到多),因为它是可选的(不是每个产品都有一个产品经理)。也不是每个员工都是产品经理,所以在另一方面也是可选的。

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

    就我个人而言,我更喜欢第一个,但都不是错的(或坏的)。

    第二种方法有两个原因。

    1. 您设想一个产品可能会有多个经理;或者
    2. 您需要跟踪产品经理的产品历史记录。您可以这样做,比如将当前的_标志列设置为“y”(或类似),其中一次只能有一个是当前的。在以数据库为中心的应用程序中,这实际上是一种非常常见的模式。
        2
  •  2
  •   1800 INFORMATION    17 年前

    在我看来,这两种行为模式是不同的。在第一个示例中,每个产品可以有一个产品经理,一个员工可以是多个产品(一对多)的产品经理。第二种似乎允许每个产品有多个产品经理(多对多)。这表明这两种解决方案在不同的情况下同样有效,您使用哪一种解决方案取决于业务规则。

        3
  •  0
  •   Massimiliano    17 年前

    第一种方法有一个缺陷。设想一下,业务需求已经改变,现在您需要能够将2个产品经理设置为一个产品。你会怎么做?是否向表产品添加另一列?讨厌。这显然违反了1nF。

    第二种方法提供的另一种选择是能够存储特定产品经理产品关系的某些属性。例如,如果一个产品有两个产品经理,那么可以将其中一个设置为主要的… 或者,例如,员工可以有一个电话号码,但作为产品经理,他/她可以有另一个电话号码…这也会被放到特别的桌子上。

        4
  •  0
  •   Paul Morgan    17 年前

    方法1)

    1. 通过附加的product manager字段(可能不是针对所有数据库,而是针对某些数据库)来减慢product表的使用。
    2. 从产品表到员工表的链接很简单。

    方法2)

    1. 使用产品表的现有查询不受影响。
    2. 增加数据库的大小。现在,您已经将product id列复制到另一个表,并向该表添加了唯一约束和索引。
    3. 从产品表到员工表的链接更加繁琐和昂贵,因为您必须先链接到中间表。

    两张桌子之间的连接频率是多少?

    有多少其他查询使用产品表?

    产品表中有多少记录?

        5
  •  0
  •   andrew cooke    14 年前

    在您给出的特定情况下,我认为两个表的主要动机是避免丢失数据的空值,这就是我将如何描述这两种方法的原因。

    有一个关于优缺点的讨论 on wikipedia .

    我敢肯定,鉴于C-Date不喜欢这个,他定义了关系理论,所以只有多表解决方案才是“有效的”。例如,您可以调用单表方法“类型不佳”(因为空值的类型是 unclear -参见第4页的引用)。