自定义数据库解决方案

1、只新增表


定义个一个模板表,只要新建一个表就用这个模板表创建,表列如下:


DataTable

ID int 主键

RowID int 记录序号,每条业务数据记录等于RowID相同的数据库记录拼接

ColumnID Guid 避免列名重复,也减少了维护的工作。

ColumnValue string 尽量大一些,可以存储大数据量的字段。

RelationTable string 对于字典数据,此列为关联的字典表的名称,否则为空


ColumnTable

ColumnID Guid 唯一的列标识

ColumnName string 列的名称,这部分由客户输入

ColumnType string 列类型,比如字符串或者数字等,根据用户选择的数据类型存储

TableID int 列所属的Table


UserDictionaryTable 用户使用的字典,字典的名称由用户输入

DID int 字典主键

DValue string 字典值


Dictionary 系统字典,用户存放字典表的名称以及其它字典信息

DID int 字典主键

DValue string 字典值

DType string 字典类别


这种方式减少了数据库的工作量,但是会增加业务逻辑,更多的数据类型判断和业务数据还原都在代码中实现,才外这种设计还会增加数据库的存储量,浪费大量的存储空间。


2、表列都新增

使用SQL语句创建每一条数据库实体,相当于SQLServer Management Studio提供的数据库对象维护功能。

1 > 创建列

ALTER TABLE table_name

ADD column_name datatype

2> 更新列

ALTER TABLE table_name

ALTER COLUMN column_name datatype

3> 删除列

ALTER TABLE table_name

DROP COLUMN column_name


此外对于列名需要一个专门的表维护中英文的关系,不过列名可以采用Guid格式的字符串,减少重名判断的工作。

对于字典数据的逻辑判断,还是需要在业务逻辑中做处理

该设计的缺陷:频繁的更新数据库的结构在数据库执行未完成而停止服务等情况下会造成数据库结构混乱,业务清除比较复杂(表对象和列对象要保存到数据库表中的)。

另一种可能是并发操作,同时多人对一个表操作后也会破坏表结构。



数据展现语句


  1. 只新增表

declare @sql varchar(8000)

set @sql = 'select RowID '

select @sql = @sql + ',sum(case ColumnID when ''' + ColumnID

+ ''' then ColumnValue end) [' + ColumnID + ']'

from (select distinct ColumnID from dataTable) as a

select @sql = @sql + ' from dataTable group by ColumnID'

exec(@sql)


取数据的时候主键为ColumnIDRowID

2、表列都新增

select * from dataTable

取数据的时候主键为RowID

posted @ 2009-04-02 13:36  消失的风  阅读(536)  评论(4编辑  收藏  举报