在连接三个表时创建的视图,一个表与另一个表相似
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以上是关于在连接三个表时创建的视图,一个表与另一个表相似的主要内容,如果未能解决你的问题,请参考以下文章
Oracle SQL 将日期维度表与另一个关于日期值的表连接起来
如何在单个表上执行 GROUP BY 并将该表与另一个表连接?