数据库设计:名称 - 值对 - 好还是坏?

时间:2010-11-30 10:29:01

标签: mysql database database-design

假设我有一个在线商店,其中每个产品都有一个类别(并且有数百种类别可供选择)分配给它(例如“书”,“便携式DVD播放器”等)。如果我需要为每个类别提供描述性字段(例如“作者”将是“书籍”类别的字段),那么在数据库中表示此字段的最佳方式是什么?

选项1(名称值对):

===========================
 field
===========================
- field_id
- category_id (FK, referring to category like "book")
- name
- value

这意味着我可以依赖一个表来表示任何类别。我担心将这些数据与其他书籍并排显示所需的旋转可能是一个潜在的问题。

选项2(个别表格):

===========================
 book_field
===========================
- book_field_id
- book_id (FK, referring to the actual book)
- author
- title
- publisher
- date_published
...

这意味着每个类别都需要一张表。

注意:并非我认为这很重要,但该类别将来自类别层次结构(例如电子产品 - > DVD播放器 - >便携式DVD播放器)。

3 个答案:

答案 0 :(得分:4)

我的0.02美元 - 每个类别一张桌子。如果情况确实不同,那么请接受并相应地设置表格。

当然,如果某些实体具有公共数据,可以进行抽象/规范化,但我认为你所拥有的名称/值对选项可能会导致一些讨厌的可读性/查询性能问题。

答案 1 :(得分:1)

您确定要仅限制一个类别吗?我的意思是,你能想到你的产品属于多个类别的任何情况吗?

嗯,无论如何,这是一个可能对你有用的解决方案:

更新(添加少量图层)

========
products
========
- product_id
- name

====================
categories_products
====================
- category_product_id
- product_id (FK)
- category_id (FK)

===========
categories
===========
- category_id
- name

=============================
products_detail_values_types
=============================
- product_detail_value_type_id
- product_id (FK)
- detail_value_type_id (FK)

====================
detail_values_types
====================
- detail_value_type_id
- detail_value_id (FK)
- detail_type_id (FK)

===============
detail_values
===============
- detail_value_id
- value

=============
detail_types
=============
- detail_type_id
- name

您的类型名为"导演":

 detail_type:
   detail_type_id: 100
   name: "director"

还有一些价值:

detail_value:
  detail_value_id: 200
  value: "James Cameron"      

类型和值的映射:

detail_value_type:
  detail_value_type_id: 300
  detail_value_id: 200
  detail_type_id: 100

哪些细节属于产品:

product_detail_value_type:
  product_detail_value_type: 400
  product_id: 500
  detail_value_type_id: 300

然后我们有类别:

category:
  category_id: 600
  name: "movie"

和类别 - 产品映射:

category_product:
  category_product_id: 700
  product_id: 500
  category_id: 600

最后是产品本身:

product:
  product_id: 500
  name: "Aliens"

答案 2 :(得分:0)

我建议你将你的设计基于互联网标签所基于的设计。

让我解释一下:

您的主对象表将需要4个表。

第一个:名称标签表,这是一个基本的表id | name,将存储对象的属性:“author”,“size”,“weight”;任何可以描述对象的东西

tag_table
id    varchar(36)
tag   varchar(36)

第二个:此表将该值与存储在tag_table值中的标记名称匹配。它确实有相同的设计

value_table
id    varchar(36)
value varchar(36)

第三个​​:将确定哪个值是哪个标记。

tag_value
id_pair  varchar(36)
id_tag   varchar(36)
id_value varchar(36)

第四个:将一个Object与其关注的数据连接起来

object_tag_value
id_object  varchar(36)
id_pair    varchar(36)

最后是你的对象表。

实施层次结构系统

对于一对多或多对多层次结构,实现一个与两个对象相关的额外表:

object_relation
id_parent varchar(36)
id_son    varchar(36)

对于多对一(例如,带有manager_id的Employee表),只需将id_parent添加为对象的成员。

使用此模式,您将具有高度可扩展性,对象现在可以具有无限的特性,您不再受限制。另外,您可以避免数据冗余,因为标签名称是唯一的。

希望我足够清楚,它可以帮助你,