可动态扩展的数据库模型设计

在通常的数据库设计中,我们定义了每个实体有多少个属性,每个属性的数据类型是什么,有多长,是否允许为空,有什么约束条件等,这些定义是完全静态的,系统创建时就全部定义好,不能动态修改。但是对于实体的属性变化很快,或者实体和属性由用户在系统中自行定义的情况下,那么就需要一个可以动态扩展的数据库模型,以保存各种动态产生的数据。

比如我们要做一个电子商务网站,需要建立一个商品表以保存各种要卖出的商品的属性。但是商品的属性各种各样,不同类别的商品在属性上千差万别,不可能建立一个静态的商品表来存储所有的属性。这个时候就需要建立动态的数据库模型。

常见的动态扩展的数据库设计方法有以下几种:

一、以字符串存储各种数据类型,通过行转列实现实体属性读取。

以前提到的电子商务网站的商品实体为例,我们可以建立两个表“商品”和“商品属性”,商品表为普通的商品属性,可以将商品名称、价格等大部分商品的公共属性放到该表中。商品表与商品属性表形成一对多关系,商品属性表只需要定义商品“属性名”和“属性值”这两个属性用于保存一个商品的各个属性。


这样在每读取一个商品时,可以读取该商品的属性集合,然后将属性集合重新绑定到对象,将该对象暂时在页面上。

这种做法的优点是灵活,可以为商品创建无数个不同的属性,可以应对电商这种快速变化,快速上线的需求。缺点是后期做统计的时候会很慢,因为需要行转列,如果要涉及到各种Join查询之类的也会很麻烦。

二、预定义大量的冗余列,根据用户对实体属性的类型设置匹配对应的列。

如果我们不希望行转列的话,那么可以预先定义好数据列,由于不确定是哪种数据类型,所以我们可以将表的列定义的特别多,每个不同的数据类型都定义几个或者十来个列,这些列都是允许为空的,如果没有使用已经预定义好的列,并不会占据多少数据空间。

在SharePoint 2007或者更早的版本中,对列表的数据存储就是采用这种方式,以下是SharePoint2007中的AllUserData表的结构。基本上为每种数据类型定义了十来个到几十个的列,用户在创建不同的列表时,都可以使用这个表存储列表数据。


这种数据库设计方法的优点是不会存在行转列的问题,所以在join或者出报表时性能较好,缺点就是使得一个表的列特别多,而且大部分列在大多数情况下是不使用的,而且扩展比较困难,比如我们要定义17个bit类型的列,但是系统默认只有16个,这种情况下,就需要在数据库中使用2行数据来表示1行列表数据。

三、使用XML数据类型存储动态列数据。

XML数据类型是SQL的一个标准,目前主流的数据库都支持XML数据类型,数据库为XML提供专门的语法以快速检索和操作XML数据。在新版的SharePoint中,就使用XML来存储用户自定义列表的内容。

对于前面提到的商品表和商品属性表,其实也可以只建立商品表,在该表中添加一XML类型的列,用于存储商品的各种属性。这是比较推荐的一种处理方法。

四、为用户定义的实体动态创建表。

还有一直动态方法是在程序中动态创建表,用户每在程序中定义一个实体的时候,就好根据用户定义创建一个对应的表。比如微软的Dynamic CRM就是这样实现的。用户可以在系统中创建大量的实体,并且还可以定义实体之间的关系,系统就会按照用户的定义创建对应的表,以及外键。

这种方法的优点是性能好,每个实体与其数据库表相对应,不存在大量的冗余列,也不会存在行转列的问题。缺点是开发难度大,对用户的要求高;而且在创建好实体并且存储了大量数据后,如果想要修改实体属性,那么将很困难。

时间: 2025-01-20 23:22:31

可动态扩展的数据库模型设计的相关文章

动态改变EnterpriseLibary数据库访问链接字符串的三种方法

使用EnterpriseLibary做数据库访问底层是我一贯的做法,除了其能兼容多种数据库,且使用其进行数据库访问,对各种数据库操作均是透明的,基本不需要对特定的数据库进行操作,编写一次操作代码,基本在各种数据库都适用.对于一些特殊的数据库,很多同行已经编写出各种各样的扩展类库,直接适用即可. 言归正传,动态改变EnterpriseLibary数据库访问链接字符串一般在使用Access数据库.Sqlite数据库等文件式的数据库比较常见,因为我们不知道客户会把程序拷贝到哪里进行使用(即使是做了安装

Dreamweaver MX 动态建站数据库路径的使用方法

dreamweaver|动态|数据|数据库 一,不推荐使用Server.Mappath(相对文档路径地址的数据库文件) 虽然具有平台移植性,但对于不同层次,不同深度下的引用该数据库的文件,将不能完整地保证数据库路径的正确性. 举个例子: 1,数据库文件cnbruce.mdb,所在文件夹database(可http访问)2,DW自动生成的连接数据库文件conn.asp,所在文件夹Connections3,如果在DW中测试连接路径成功,则必须输入地址为Server.Mappath("../datab

用于动态内容和数据库交互的最优秀的语言:PHP

Joe Brockmeier 简要介绍了 PHP 脚本语言,讨论了 PHP 的起源.性能和适用的平台.一个简单的 PHP 脚本示例则着重说明了其基本语法和用法. 如果您从事基于 Web 的开发工作,那么可能已经听说过 PHP.您也许不太确切地知道 PHP 是什么.如何工作或者为什么如此热门,但现在该是进一步了解 PHP 的时候了.因此本文简要介绍了关于 PHP 基础的基本概念. 一点背景知识 PHP 是作为一个小开放源码,随着越来越多的人意识到它的实用性从而逐渐发展起来.Rasmus Lerdo

ArrayList的动态扩展

ArrayList相比较Array来说,具有的优势是可以动态扩展,即它所包含的成员 个数是不确定的,可以随着不断地添加,或者移除进行扩展.但我们一定要知道 的是,ArrayList是基于Array(数组)的,我们来看一下它的构造函数 其实这个Items是一个object的数组.这也从另外一方面说明了ArrayList是基 于Object的,所以无法避免装箱和拆箱操作.这与泛型的List是不一样的

One to One 的数据库模型设计与NHibernate配置

在数据库模型设计中,最基本的实体关系有三种:一对一.一对多.多对多.关于一对多和多对多使用的情况较多,之前也有过一些讨论,现在来说明一下在数据库中一对一的模型设计. 首先,关系数据库中使用外键来表示一对多,使用中间表和两边的外键来表示多对多,而一对一的话有三种表示方式:一种是使用相同的主键值,第二种是使用单边的外键,第三种就是使用双边外键. 1.主键关联 比如我们在做一个ER系统时,设计了一个Employee表保存员工的基本信息(主表),另外有一个EmployeePhoto表(外表),用于保存员

jquery ui如和动态的 从数据库动态添加选项卡

问题描述 jquery ui如和动态的 从数据库动态添加选项卡 求解 小弟不知道该怎么写,求思路 谢谢了. jquery ui如和动态的 从数据库动态添加选项卡 我要从数据库取列表填充给 选项卡 谢谢 解决方案 你按照jqueryui的html代码,生成需要的结构就好了 $(function() { $( "#tabs" ).tabs(); }); </script> <div id="tabs"> <ul> <li>

docker调整rootfs分区大小及动态扩展容器空间

调整docker中rootfs的分区大小 这里主要介绍的调整Container内rootfs的大小,rootfs默认的是10G,我们可以通过下面的方法增大该大小.     bash-4.1# df -lhT    Filesystem Type Size Used Avail Use% Mounted on    rootfs rootfs 9.8G 1.4G 7.9G 15% /    tmpfs tmpfs 921M 0 921M 0% /dev    shm tmpfs 64M 0 64M

当我在JSP页面上动态的往数据库里插入数据时,在页面上显示新插入的记录的时候,该条记录总是显示在最后一条,怎么做才能让刚刚新插入的记录显示在最前面?

问题描述 在数据库中往外读取数据时,在页面上用表格显示是按照数据表里的ID号依次往下排的,当我在JSP页面上动态的往数据库里插入数据时,在页面上显示新插入的记录的时候,该条记录总是显示在最后一条,怎么做才可以让刚刚新插入的记录显示在JSP页面最前面,也就是显示在第一条的位置上?(用的是表格显示数据) 解决方案 解决方案二:你查询的时候按ID降序获得结果集这样不就可以了解决方案三:引用1楼zn85600301的回复: 你查询的时候按ID降序获得结果集这样不就可以了 只有引用的内容不允许回复!解决方

积分兑换的一个个格子要做成动态能从数据库里面取数据的要怎么做

问题描述 积分兑换的一个个格子要做成动态能从数据库里面取数据的要怎么做 几排几排的,要能从后台取数据的,有没有什么控件或插件可以做,如果自己设计的话 要怎么设置,并且能一排排,每排有几个这样子