【问题标题】:Database Design: Join tables on supertype/subtype数据库设计:在超类型/子类型上连接表
【发布时间】:2011-07-24 22:00:48
【问题描述】:

我确信我不是第一个提出这个问题的人,但我找不到一个好的答案,我承认数据库设计不是我的主要优势。

假设我有一个产品,这个产品可以有子类型,产品 A、产品 B、产品 C 和产品 D。超类型产品将具有一些公共属性,而子类型将具有特定于这些子类型的属性。非常标准的超类型/子类型设计。

现在我有一个用户实体。一个产品可以有很多用户,一个用户可以有很多产品。所以理想情况下,我想要一个关于这些连接的连接表,其中包含一些关于该连接的特定属性。我遇到的问题是我不想做一个产品用户连接表,但更像是一个用户和产品子类型的连接,所以一个产品A用户、产品B用户、产品C用户、产品D用户。原因是这两个实体的联接具有特定于该产品和用户联接的自己的属性。

这个设计有意义吗?或者有没有更好的方法来处理这种行为。我喜欢我的产品的标准超类型/子类型,但是当我需要将它们与其他实体一起加入时,我不确定如何处理。

【问题讨论】:

    标签: database-design


    【解决方案1】:

    在某些数据库中加入超类型是有意义的,在某些数据库中加入单个子类型是有意义的,并且在某些数据库中将不同的数据同时加入超类型和子类型是有意义的。

    (ProductA,User)的表是否真的会与(ProductB,User)有不同的列?如果是这样,那么这就是你的答案。不同的属性,不同的东西,不同的表。分离 m:n 个表,并引用子类型。

    (稍后)

    我回答了another SO question 并包含了执行此操作的代码。

    【讨论】:

    • 我查看了您的示例,感谢您指出这一点。与用户连接时的子类型将具有不同的列。 ProductAUser 和 ProductBUser 会有不同的列。
    【解决方案2】:

    好吧,如果您想捕获有关 ProductA-User 关系和 ProductB-User 关系的不同信息,那么 Product-User 表似乎没有意义。就个人而言,当我有一个 Product 表以及 ProductA、ProductB 等时,出于性能或可维护性的原因,我已经后悔了。我的直觉反应通常是消除 Product 表。

    【讨论】:

    • 我大体上同意这一点。需要考虑的其他一些事情是某些数据库上的稀疏列,其中空列占用的空间更少。此外,如果您需要一个查询位置,您可以在 ProductA、ProductB 表的联合之上创建一个视图。
    • 那么通过这条路线,您是说真的没有理由使用超类型/子类型设计,而只有一个 ProductA、ProductB 等表,然后是与用户的单独连接表?这可能会有一些数据冗余,但如果以后不会那么混乱,它可能是更好的选择。
    猜你喜欢
    • 2012-08-28
    • 2012-01-22
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多