选项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播放器)。
答案 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添加为对象的成员。
使用此模式,您将具有高度可扩展性,对象现在可以具有无限的特性,您不再受限制。另外,您可以避免数据冗余,因为标签名称是唯一的。
希望我足够清楚,它可以帮助你,