sql - 从子类 : How many queries do I need? 中选择产品

标签 sql mysql database-design

我正在构建一个类似于描述的数据库 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/

相关文章:

MySQL 左连接查询不起作用

php - 加入两个mysql表并在php中填充一个数组

sql-server - 对于可以大规模扩展的应用程序,我们是否应该从多个小粒度数据库开始

mysql - 不同表中多个值的总和

从任何地方远程访问 MySQL

mysql - SQL - 带有修订历史记录的注释系统

html - 如何添加多个标题HTML表格?

使用多个表的 SQL Server 更新

sql - 在这种特定情况下如何显示空行?

sql时区计算