我正在构建一个类似于描述的数据库 here我有不同类型的产品,每种类型都有自己的属性。
为了方便,我报告了一个简短的版本
product_type
============
product_type_id INT
product_type_name VARCHAR
product
=======
product_id INT
product_name VARCHAR
product_type_id INT -> Foreign key to product_type.product_type_id
... (common attributes to all product)
magazine
========
magazine_id INT
title VARCHAR
product_id INT -> Foreign key to product.product_id
... (magazine-specific attributes)
web_site
========
web_site_id INT
name VARCHAR
product_id INT -> Foreign key to product.product_id
... (web-site specific attributes)
这样我就不需要为不同产品类型的每个属性创建一个包含一列的巨大表格(其中大部分将为 NULL)
如何通过 product.product_id
SELECT
产品并查看其所有属性?
我是否必须首先进行查询以了解我正在处理的产品类型,然后通过某种逻辑进行另一个查询以JOIN
正确的表?或者有没有办法把所有的东西结合在一起? (如果,当我检索一个product_id的信息时,有很多NULL,此时就可以了)。
谢谢
最佳答案
不错的设计。很好地避免了实体属性值陷阱。
您将按照您的建议简单地进行连接,但我认为不需要两个查询。我什至认为 product_type 表不是必需的。
SELECT * FROM product p
LEFT JOIN magazine m
ON m.product_id = p.product_id
LEFT JOIN web_site w
ON w.product_id = p.product_id
在上面的查询中,对于杂志,m.product_id IS NOT NULL,对于网站,w.product_id IS NOT NULL。
仅限杂志:
SELECT * FROM product p
JOIN magazine m
ON m.product_id = p.product_id
仅限网站:
SELECT * FROM product p
JOIN web_site w
ON w.product_id = p.product_id
您的大问题是关于获取列名称?您可能正在编写这些代码,或者您使用反射来获取它们。大多数数据库访问层都提供反射。
关于sql - 从子类 : How many queries do I need? 中选择产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2875918/