Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 数据库设计:具有不同属性的对象_Mysql_Database Design_Innodb - Fatal编程技术网

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映射”之类的东西。

这是一个典型的面向对象的关系表设计。您描述的表设计称为“每个子类的表”。与应用程序中的对象实际外观相比,三种最常见的设计都是折衷:

  • 每种混凝土等级的表
  • 每个层次结构的表
  • 每个子类的表
  • 您不喜欢的设计——“表有100列,大多数值为空”——是2。一个表来存储整个专门化层次结构。由于各种原因,这是最不灵活的,包括-如果你的应用程序需要一个新的子类,你需要添加列。您描述的设计能够更好地适应更改,因为您可以通过添加一个新的子类表(由product_type中的值描述)来添加和扩展它

    剩下的选项是-1。每个具体类的表-通常是不可取的,因为在实现每个专门化表中的所有公共字段时涉及到重复。尽管如此,其优点是您不需要执行任何连接,并且子类表甚至可以位于非常大的系统中的不同db实例上

    你所描述的设计是完全可行的。下面的变化是,如果您使用ORM工具执行CRUD操作,它可能会是什么样子。请注意,每个子类表中的ID是如何作为层次结构中父表的FK值的。好的ORM将仅根据product.id和product.product_type_id中的鉴别器值自动管理正确的子类表CRUD。无论您是否计划使用ORM,请查看hibernate的联合子类文档,如果只是为了查看他们所做的设计决策的话

    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
    ..
    

    对三种可能的设计有很好的概述,谢谢。所有答案都很好,但我只能选择一个