How to design a product table for many kinds of product where each product has many parameters
https://stackoverflow.com/questions/695752/how-to-design-a-product-table-for-many-kinds-of-product-where-each-product-has-m
You have at least these five options for modeling the type hierarchy you describe:
Single Table Inheritance: one table for all Product types, with enough columns to store all attributes of all types. This means a lot of columns, most of which are NULL on any given row.
Class Table Inheritance: one table for Products, storing attributes common to all product types. Then one table per product type, storing attributes specific to that product type.
Concrete Table Inheritance: no table for common Products attributes. Instead, one table per product type, storing both common product attributes, and product-specific attributes.
Serialized LOB: One table for Products, storing attributes common to all product types. One extra column stores a BLOB of semi-structured data, in XML, YAML, JSON, or some other format. This BLOB allows you to store the attributes specific to each product type. You can use fancy Design Patterns to describe this, such as Facade and Memento. But regardless you have a blob of attributes that can't be easily queried within SQL; you have to fetch the whole blob back to the application and sort it out there.
Entity-Attribute-Value: One table for Products, and one table that pivots attributes to rows, instead of columns. EAV is not a valid design with respect to the relational paradigm, but many people use it anyway. This is the "Properties Pattern" mentioned by another answer. See other questions with the eav tag on StackOverflow for some of the pitfalls.
I have written more about this in a presentation, Extensible Data Modeling.
Additional thoughts about EAV: Although many people seem to favor EAV, I don't. It seems like the most flexible solution, and therefore the best. However, keep in mind the adage TANSTAAFL. Here are some of the disadvantages of EAV:
- No way to make a column mandatory (equivalent of
NOT NULL). - No way to use SQL data types to validate entries.
- No way to ensure that attribute names are spelled consistently.
- No way to put a foreign key on the values of any given attribute, e.g. for a lookup table.
- Fetching results in a conventional tabular layout is complex and expensive, because to get attributes from multiple rows you need to do
JOINfor each attribute.
The degree of flexibility EAV gives you requires sacrifices in other areas, probably making your code as complex (or worse) than it would have been to solve the original problem in a more conventional way.
And in most cases, it's unnecessary to have that degree of flexibility. In the OP's question about product types, it's much simpler to create a table per product type for product-specific attributes, so you have some consistent structure enforced at least for entries of the same product type.
I'd use EAV only if every row must be permitted to potentially have a distinct set of attributes. When you have a finite set of product types, EAV is overkill. Class Table Inheritance would be my first choice.
关于EAV的补充想法:虽然很多人似乎都喜欢EAV,但我不喜欢。这似乎是最灵活的解决方案,因此也是最好的。但是,请记住TANSTAAFL这句格言。以下是EAV的一些缺点:
无法强制列(相当于NOT NULL)。
无法使用SQL数据类型验证条目。
无法确保属性名称拼写一致。
无法将外键放在任何给定属性的值上,例如对于查找表。
在传统的表格布局中获取结果是复杂而昂贵的,因为要从多行获取属性,需要对每个属性执行JOIN。
EAV为您提供的灵活性要求您在其他方面做出牺牲,这可能会使您的代码比用更传统的方法解决原始问题更复杂(或者更糟)。
在大多数情况下,没有必要有那么大的灵活性。在OP关于产品类型的问题中,为特定于产品的属性创建每个产品类型的表要简单得多,因此至少对相同产品类型的条目要强制执行一些一致的结构。
只有当每一行都必须被允许具有一组不同的属性时,我才会使用EAV。当你有一组有限的产品类型时,EAV是多余的。类表继承将是我的首选。
How to design a product table for many kinds of product where each product has many parameters的更多相关文章
- react ,ant Design UI中table组件合并单元格并展开详情的问题
需求:购物车订单列表,如图: 一:单元格合并 遇到这种你会怎么办呢? 单元格合并? 还是其他的方法? 下面是我的处理方式,就是在table 组件的columns上处理,这里拿商品举例,其余的类似, ...
- ant design pro---ProTable关闭Table上的提示信息
toolBarRender={false} tableAlertRender={false}
- Managing Hierarchical Data in MySQL
Managing Hierarchical Data in MySQL Introduction Most users at one time or another have dealt with h ...
- [转]FluentData
本文来自:http://fluentdata.codeplex.com/wikipage?title=Fluency&referringTitle=Home Documentation Fl ...
- Snowflake weakness and type2 fact table
DimProduct DimSubcategory Dimcategory productpk subcategorypk categorypk sku subcategoryName categor ...
- Thinking In Design Pattern——MVP模式演绎
原文<Thinking In Design Pattern——MVP模式演绎>不知为何丢失了,故重新整理了一遍. 目录 What Is MVP Domain Model StubRepos ...
- 数据库设计(二)Introduction to Database Design
原文链接:http://www.datanamic.com/support/lt-dez005-introduction-db-modeling.html Introduction to Databa ...
- In-App Purchase Programming Guide----(三) ----Retrieving Product Information
Retrieving Product Information In the first part of the purchase process, your app retrieves informa ...
- Entity Framework – (复数)Plural and (单数)Singular 表名Table names
By default, the Entity Framework will assume that all of the names of your tables in your database a ...
随机推荐
- JAVASCRIPT数据类型(值类型-引用类型-类型总览)
值类型:也称为原始数据或原始值(primitive value). 这类值存储在栈(stack)中,栈是内存中一种特殊的数据结构,也称为线性表,栈按照后进先出的原则存储数据,先进入的数据被压入栈底,最 ...
- WPF 绑定以基础数据类型为集合的无字段名的数据源
WPF 绑定以基础数据类型为集合的无字段名的数据源 运行环境:Window7 64bit,.NetFramework4.61,C# 6.0: 编者:乌龙哈里 2017-02-21 我们在控件的数据绑定 ...
- Elasticsearch-2.4.3的3节点安装(多种方式图文详解)(含 head、kopf、marvel、shield和watcher插件安装和使用)
前提: Elasticsearch-2.4.3的下载(图文详解) Elasticsearch-2.4.3的单节点安装(多种方式图文详解) 我这里,以192.168.80.10(HadoopMaster ...
- UNITY引擎变量调用产生不必要内存分配
https://unity3d.com/de/learn/tutorials/topics/performance-optimization/optimizing-garbage-collection ...
- Python实现七牛云视频播放
这篇文章是使用Python的Web框架Django Rest Framework来提供视频相关的api接口,主要功能包括视频上传.视频转码.视频访问授权.删除视频文件.视频截图功能. 七牛云上的基本概 ...
- 92. Reverse Linked List II (List)
Reverse a linked list from position m to n. Do it in-place and in one-pass. For example: Given 1-> ...
- Python学习笔记_使用openpyxl操作Excel,在同一个文件里复制某一个sheet
应用场景:定制一个Excel模板文件,其中定义了一个模板Sheet,以此模板文件里的模板sheet为样例,制作报表,里面有不止一个模板样例Sheet 一.软件环境: 1.OS:Win10 64位 2. ...
- C++ std::vector
std::vector template < class T, class Alloc = allocator<T> > class vector; // generic te ...
- 如何启动jdeveloper中集成的weblogic
1>运行jdeveloper,打开运行日志,入下图,日志最开始的红框部分就是打开weblogic的命令,将此命令复制出来执行即可打开weblogic 程序员的基础教程:菜鸟程序员
- Spring.net 在aps.net Web的配置复习
1.引入程序集Spring.Core,CommonLogging,Spring.Web 2.Web.Config的配置 <?xml version="1.0" encodin ...