两难的境界:不定字段数目的数据库表设计和数据结构
2005-07-15 14:00
483 查看
两难的境界:不定字段数目的数据库表设计和数据结构
昨天项目组会议上讨论的关于不定字段数目的数据库表问题并没有结果,今天继续分析之后发现问题可能还更大。当时讨论的结果是可能采用四种技术:
动态增加数据库表字段
预留足够的空白字段,运行时作动态影射
用xml格式保存在单字段里
改列为行,用另外一个表存放定制字段
现在我们来分析一下四种技术的优劣,不过首先可以排除的是第一点动态增加字段的方法,因为在实际操作时候几乎是不可能的(sqlserver太慢,oracle索性不支持),基本可以不讨论就排除。剩下后三点。
先来讨论预留空白字段的方法,基本原理就是在数据库表设计的时候加入一些多余的字段,看下面的代码:
CREATE TABLE Sample(
name varchar(12),
field0 varchar(1),
field1 varchar(1),
fieldN varchar(1)
}
然后看实际运行时候的需要,动态分配字段给系统使用,也许需要一个这样的结构来描述分配情况:
public class Available
public class Entity01
public class Entity01
CREATE TABLE Sample
(
Name varchar(12),
Xml CLOB(102400) // 仅作说明而已
)
然后对应这样的类定义
public class Entity01
CREATE TABLE SampleFields
(
idSample Integer,
fieldName varchar(30),
fieldValue varchar(100)
)
其中idSample关联到Sample表的id字段(我没有写出来)。这样的话,Hibernate很容易支持,也可以支持Sql的查询,而且可以支持把内容放到Hashtable中去,看起来是目前最好的方式了。但是在大容量数据的时候,SampleFields表的数据会是主表数据量的N倍(看定制的字段数目多少而定),同样存在有很严重的性能问题。
哪位高人还能再给一个方案?
---------2005-7-22新增-----------
很多朋友给出了很好的建议,其中蛙蛙池塘 给出了一个表结构,因为看起来不甚方便,我把类图画出来如下:
图所表示的内容简单来说是这样:
1。一个很宽的表ProductAttributeValues,包含用到的几乎所有可能的类型的值,但是每次只能用一个类型的值
2。将可变的列转为行,存放到上表中
3。为了存放类型定义和一些下拉列表的内容,设计了ProductAttributeTemplates和关联的其他表
4。ProductListItems中存放Product中所有项的说明和顺序。
这种思路其实就是把产品的“知识级”(设计模式用语)和“操作级”都表现出来了,如果要划分,则图的左上角三个表属于“操作级”,其余的属于“知识级”。wljcan 网友建议我去看《设计模式》的“观察模式”,我发现上图其实就是一种和“观察模式”相似的设计。《设计模式》看了很久都没能看下去,不过这几天正在看“观察模式”,等有心得了,再来看看能不能对上图的结构修改一下。
怡红公子 提醒说oracle和sql server对xml字段其实已经不错了,所以找了一下,但是真的是既产品中恐怕还是不敢用,不知道性能如何。虽然采用xml方式是我最推崇的方法。而且一旦采用xml方式存储,恐怕就会有changyu 网友提醒的数据类型问题,要存一个图片的话恐怕就歇菜了(当然也不是说xml中就一定不能存图片)。
不过我现在觉得xml字段还是要的,作为辅助存储手段,因为毕竟未来查询起来可能会更方便些,然后结合“观察模式”也就是类似上图的方法作为主要的存储手段,虽然有一些冗余,结合我的使用 NVelocity 解析 PowerDesigner 的cdm文件 ,工作量也不会太大。
再研究研究看看。
昨天项目组会议上讨论的关于不定字段数目的数据库表问题并没有结果,今天继续分析之后发现问题可能还更大。当时讨论的结果是可能采用四种技术:
动态增加数据库表字段
预留足够的空白字段,运行时作动态影射
用xml格式保存在单字段里
改列为行,用另外一个表存放定制字段
现在我们来分析一下四种技术的优劣,不过首先可以排除的是第一点动态增加字段的方法,因为在实际操作时候几乎是不可能的(sqlserver太慢,oracle索性不支持),基本可以不讨论就排除。剩下后三点。
先来讨论预留空白字段的方法,基本原理就是在数据库表设计的时候加入一些多余的字段,看下面的代码:
CREATE TABLE Sample(
name varchar(12),
field0 varchar(1),
field1 varchar(1),
fieldN varchar(1)
}
然后看实际运行时候的需要,动态分配字段给系统使用,也许需要一个这样的结构来描述分配情况:
public class Available
public class Entity01
public class Entity01
CREATE TABLE Sample
(
Name varchar(12),
Xml CLOB(102400) // 仅作说明而已
)
然后对应这样的类定义
public class Entity01
CREATE TABLE SampleFields
(
idSample Integer,
fieldName varchar(30),
fieldValue varchar(100)
)
其中idSample关联到Sample表的id字段(我没有写出来)。这样的话,Hibernate很容易支持,也可以支持Sql的查询,而且可以支持把内容放到Hashtable中去,看起来是目前最好的方式了。但是在大容量数据的时候,SampleFields表的数据会是主表数据量的N倍(看定制的字段数目多少而定),同样存在有很严重的性能问题。
哪位高人还能再给一个方案?
---------2005-7-22新增-----------
很多朋友给出了很好的建议,其中蛙蛙池塘 给出了一个表结构,因为看起来不甚方便,我把类图画出来如下:
图所表示的内容简单来说是这样:
1。一个很宽的表ProductAttributeValues,包含用到的几乎所有可能的类型的值,但是每次只能用一个类型的值
2。将可变的列转为行,存放到上表中
3。为了存放类型定义和一些下拉列表的内容,设计了ProductAttributeTemplates和关联的其他表
4。ProductListItems中存放Product中所有项的说明和顺序。
这种思路其实就是把产品的“知识级”(设计模式用语)和“操作级”都表现出来了,如果要划分,则图的左上角三个表属于“操作级”,其余的属于“知识级”。wljcan 网友建议我去看《设计模式》的“观察模式”,我发现上图其实就是一种和“观察模式”相似的设计。《设计模式》看了很久都没能看下去,不过这几天正在看“观察模式”,等有心得了,再来看看能不能对上图的结构修改一下。
怡红公子 提醒说oracle和sql server对xml字段其实已经不错了,所以找了一下,但是真的是既产品中恐怕还是不敢用,不知道性能如何。虽然采用xml方式是我最推崇的方法。而且一旦采用xml方式存储,恐怕就会有changyu 网友提醒的数据类型问题,要存一个图片的话恐怕就歇菜了(当然也不是说xml中就一定不能存图片)。
不过我现在觉得xml字段还是要的,作为辅助存储手段,因为毕竟未来查询起来可能会更方便些,然后结合“观察模式”也就是类似上图的方法作为主要的存储手段,虽然有一些冗余,结合我的使用 NVelocity 解析 PowerDesigner 的cdm文件 ,工作量也不会太大。
再研究研究看看。
相关文章推荐
- 不定字段数目的数据库表设计和数据结构
- 不定字段数目的数据库表设计和数据结构
- 不定字段数目的数据库表设计和数据结构
- 不定字段数目的数据库表设计和数据结构
- 如何设计动态(不定)字段的产品数据库表?
- 【原创】不定字段的数据库表设计思路
- 如何设计动态(不定)字段的产品数据库表?--淘宝多产品属性字段设计方法
- 数据库设计,表留1-2个字段扩充
- 数据库设计之设计表和字段
- 设计修改MSSQLServer 数据库表 字段 报错 ALTER TABLE only allows columns ... 对无法重新创建的表进行了更改...
- 怎样得到数据库中某一个表的某一个字段在设计时候的数据类型
- pdm设计表完成之后导入Navicat数据库,字段注释乱码问题解决
- 怎样查看隐藏设计数据库的文档字段信息
- NDatabase 入门,简单使用 增删改查。让NDatabase带你脱离ADO.net,各种SQL 语句,各种DBMS,各种CRM,IOC之类的烦恼。我们也不需要仓库设计模式了,你妹的。不要表了,不要设计数据库字段了。就这样!
- 数据库设计时间字段
- 数据库表扩展字段设计思路
- 关于数据库Varchar字段类型长度设计问题(转载)
- 数据库表扩展字段设计思路
- 数据库设计时设计标识字段的一些思考[mysql]
- 数据库表及字段命名、设计规范