在连接三个表时创建的视图,一个表与另一个表相似

Posted

技术标签:

【中文标题】在连接三个表时创建的视图,一个表与另一个表相似【英文标题】:A view created on joining three tables, one table is a similar to another 【发布时间】:2012-02-08 22:44:23 【问题描述】:

这可能是个坏主意,但我看到了这个设计并想评估一下: 我通过连接两个表(基于 product 和 productDetail 表的产品视图)创建了一个视图。

    SELECT
    tP.ProductId,
    tP.ProductType,
    tP.Description
    tPD.Statement,
    tPD.Condition,
FROM
    tbl_Product AS tP
    INNER JOIN tbl_ProductDetail AS tPD
        ON tP.ProductId = tPD.ProductId

现在,我有一个新产品类型,需要在详细信息表中添加一个新字段(例如 ExpirationDate)。一个论点是,由于这仅适用于特定产品类型,因此我们创建了一个名为 tbl_FoodProductDetial 的新表(新表将包含 Statement、Condition 和 ExpirationDate)。直观地说,我认为在 tbl_ProductDetail 中包含这个字段更好,所以我们只需要在视图中添加额外的字段,而不用担心任何新的变化。但反对这一点的论点是在一般产品详细信息表中添加字段 (ExpirationDate) 是不合适的。有什么建议么? 如果你更喜欢第三张表,如何加入这三张表(一个是另一个的子表)?

【问题讨论】:

我认为将expirationDate 添加到tbl_ProductDetail 很好。即使只有一些产品有过期日期,该字段仍然与所有产品相关,因为它告诉您它们不会过期。 @MichaelFredrickson,非常有效的观点! 加入很简单:LEFT JOIN tbl_FoodProductDetial tFPD ON tFPD.ProductId = tP.ProductId 【参考方案1】:

您需要用更多的工作来权衡架构的纯度。将新字段粘贴到同一张表上会不会导致您将来出现维护问题?如果没有,请使用字数较少的方法(坚持下去!)。如果您认为额外的字段会使应用程序变得难以理解和改进,请引入第三个表。

在这种情况下,我认为您可以安全地重用现有表。第三张桌子的工作量会比我认为合适的多。

【讨论】:

【参考方案2】:

我同意 Michael 和 usr 的观点。此外,听起来第三个表的论点是使用面向对象的派生逻辑:Food 类派生自 Product 类,他们正试图将数据库与其类对齐。这种想法最终会产生如此多的表格,几乎无法维护。

【讨论】:

几乎每个属性都有一个表的名称:6NF

以上是关于在连接三个表时创建的视图,一个表与另一个表相似的主要内容,如果未能解决你的问题,请参考以下文章

hibernate jpa将两个表与另一个表连接起来

将预先连接的表与另一个表合并

Oracle SQL 将日期维度表与另一个关于日期值的表连接起来

如何在单个表上执行 GROUP BY 并将该表与另一个表连接?

如何将一个表与另一个表连接,然后计算非空列并将它们按另外两个字段分组?

MYSQL数据库中三个数据表如何实现关联