Mysql 数据库设计:具有不同属性的对象
我正在设计一个产品数据库,其中产品可以根据其类型具有非常不同的属性,但每个类型的属性都是固定的,并且类型根本不可管理。例如: 杂志:标题、发行号、页数、份数、结束日期、发行日期Mysql 数据库设计:具有不同属性的对象,mysql,database-design,innodb,Mysql,Database Design,Innodb,我正在设计一个产品数据库,其中产品可以根据其类型具有非常不同的属性,但每个类型的属性都是固定的,并且类型根本不可管理。例如: 杂志:标题、发行号、页数、份数、结束日期、发行日期 网站:名称、带宽、点击率、日期从、日期到 我想使用InnoDB并尽可能地加强数据库的完整性。推荐的处理方法是什么 我讨厌那些表有100列且大多数值为空的设计,所以我想到了这样的事情: product_type ============ product_type_id INT product_type_name VARC
网站:名称、带宽、点击率、日期从、日期到 我想使用InnoDB并尽可能地加强数据库的完整性。推荐的处理方法是什么 我讨厌那些表有100列且大多数值为空的设计,所以我想到了这样的事情:
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
valid_since DATETIME
valid_to DATETIME
magazine
========
magazine_id INT
title VARCHAR
product_id INT -> Foreign key to product.product_id
issue_number INT
pages INT
copies INT
close_date DATETIME
release_date DATETIME
web_site
========
web_site_id INT
name VARCHAR
product_id INT -> Foreign key to product.product_id
bandwidth INT
hits INT
date_from DATETIME
date_to DATETIME
这可以处理级联产品删除,但。。。嗯,我不完全相信。 你似乎大致上是正确的轨道,除了你可能需要考虑“产品”和通常被称为“库存单元”(SKU)之间的区别。一盒25个单位的回形针(某种特定类型)是否与一盒50个单位的回形针相同?就商店或任何种类的库存系统而言,区别很重要;事实上,在某些情况下,在包装上对相同数量的相同基础“产品”进行简单的区分可能会给您提供不同的SKU来跟踪
如果这个问题对您的应用程序很重要,您需要决定在哪里跟踪这个问题(可以像您一样布置产品,并在其他表中处理SKU用途的打包,例如,即使对于某些应用程序可能会有轻微的开销)。这实际上是一种“强制”的标准方式经典关系数据库管理系统中的一种面向对象设计 所有“公共”属性都放在主表上(例如,如果价格是在产品表级别上指定的,那么它很容易成为主表的一部分),而细节则放在子表上 理论上,如果您有子类型(例如,杂志可以在日报和四色期刊中进行子类型划分,可能期刊有保质期的日期间隔),您也可以添加一个或多个子级别 这是一种非常常见(并且经过验证)的设计。唯一需要注意的是,对于大多数操作,主表总是至少与子表连接。如果您有无数项,这可能会影响性能 另一方面,对于每种类型的子类型,删除项(我建议进行逻辑删除,在主表上将标志设置为“true”)等常见操作都会执行一次
不管怎样,去做吧。也许谷歌搜索“面向对象到RDBMS映射”之类的东西。这是一个典型的面向对象的关系表设计。您描述的表设计称为“每个子类的表”。与应用程序中的对象实际外观相比,三种最常见的设计都是折衷:
product
=======
id INT
product_name VARCHAR
product_type_id INT -> Foreign key to product_type.product_type_id
valid_since DATETIME
valid_to DATETIME
magazine
========
id INT -> Foreign key to product.product_id
title VARCHAR
..
web_site
========
id INT -> Foreign key to product.product_id INT
name VARCHAR
..
对三种可能的设计有很好的概述,谢谢。所有答案都很好,但我只能选择一个