0

我正在考虑将具体表继承用于一个用例,并且需要帮助确定我是否需要使用识别与非识别关系,以及是否需要准确地构造我的表。

我的用例

我有一个 HTML 表单对象,其中的表单在很多方面都是相同的,即它是一个大型表单,对于不同的产品是相同的,除了product_options,它根据确切的不同而不同product_type。我想将表单数据保存到表中,以便存储/检索。我想我想使用 Concrete Table 实现,并且需要反馈是否可以这样做。

这是我的想法:

在此处输入图像描述

假设我想检索“A”类型产品的信息,我

  1. 读取 selection_for,检索product_type
  2. 基于product_type我阅读了相应的选项表

这个好像有点复杂……

我也在使用 Doctrine ORM 在后台驱动数据库,因此这种数据操作可能很难通过 ORM API 实现,但我想先考虑这个选项。

问题:

  • 我的设计会按原样工作吗?可以改进吗?我是否正确实施了混凝土表设计?
  • 我对产品选项表使用识别关系还是非识别关系?

我也可以像这样做一个替代图表:

在此处输入图像描述

如果这些外键之一不为 NULL,那么我读取该键,然后读取相应的表以检索数据。

问题:

与第一种方法相比,第二种方法有什么优点或缺点吗?

4

1 回答 1

0

原来 Doctrine ORM 已经处理了这个问题。3种不同的方式:

映射超类

在我的情况下创建 3 个表,每个表都有共享和具体字段/列

单表继承

将所有选项放入一个表中(一个表,不使用其他表)。使用discriminator字段来提取正确的选项。

类表继承

又名JOINED类型。在我的情况下创建 4 个表,每种类型一个,加上 main。选项表仅包含与它们相关的选项,主表包含任何共享字段和discriminator字段。

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html

我猜正是我在寻找的东西。这使 SQL 工作脱离了我的掌控。

现在,要决定使用哪一个....

于 2017-05-10T19:55:16.070 回答