Database design 数据库设计:超类型/子类型上的联接表

Database design 数据库设计:超类型/子类型上的联接表,database-design,Database Design,我相信我不是第一个提出这个问题的人,但我找不到一个好的答案,我承认数据库设计不是我的主要优势 假设我有一个产品,这个产品可以有子类型,产品a、产品B、产品C和产品D。超类型产品将有一些公共属性,而子类型将有特定于这些子类型的属性。非常标准的超类型/子类型设计 现在我有了一个用户实体。一个产品可以有多个用户,一个用户可以有多个产品。因此,理想情况下,我希望在这些连接上有一个连接表,其中包含关于该连接的一些特定属性。我的问题是,我不想做产品用户联接表,而是更像是与用户和产品子类型的联接,即Produ

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

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

现在我有了一个用户实体。一个产品可以有多个用户,一个用户可以有多个产品。因此,理想情况下,我希望在这些连接上有一个连接表,其中包含关于该连接的一些特定属性。我的问题是,我不想做产品用户联接表,而是更像是与用户和产品子类型的联接,即ProductA用户、ProductB用户、ProductC用户、ProductD用户。原因是,这两个实体的连接具有特定于该产品和用户连接的自身属性


这个设计有意义吗?还是有更好的方法来处理这种行为。我喜欢我的产品的标准超类型/子类型,但我不确定当我需要将这些超类型/子类型与其他实体连接时如何处理

在某些数据库中连接到超类型是有意义的,在某些数据库中连接到单个子类型是有意义的,在某些数据库中连接不同的数据到超类型和子类型也是有意义的

(ProductA,User)的表的列是否确实与(ProductB,User)的列不同?如果是的话,那就是你的答案。不同的属性,不同的东西,不同的表格。单独的m:n表,并引用子类型

(稍后)


我回答了,并包含了与此完全相同的代码。

好吧,如果您想捕获有关ProductA用户关系和ProductB用户关系的不同信息,那么Product User表似乎没有意义。就我个人而言,当我拥有一个产品表,以及ProductA、ProductB等时,出于性能或可维护性的原因,我对它感到遗憾。我的直觉反应通常是删除产品表。

我大体上同意这一点。另外需要考虑的是一些数据库中的稀疏列,其中空列占用的空间更少。此外,如果您需要一个查询位置,您可以在ProductA、ProductB表的并集上创建一个视图。因此,通过这种方法,您是说,您真的没有理由使用超类型/子类型设计,只需要一个ProductA、ProductB等表,然后与用户单独联接表?这可能会有一些冗余的数据,但如果以后不再那么混乱的话,这可能是更好的选择。我在这里查看了您的示例,感谢您指出这一点。在这种情况下,当与用户连接时,子类型将具有不同的列。ProductAUser和ProductBUser将有不同的列。