可扩展数据架构浅析--还需要理解

可扩展不只是tenant可扩展,还要有其他可扩展,这里有这样几个概念:
第一:界面可扩展;
这个很容易理解,用户菜单可以定义,这个一般是程序实现和数据库的关系不是很大,如果按照面向界面编程的思路进行下去的话,这个非常简单,在面向界面编程的时候再说明清楚。
第二:功能可扩展;
这个主要是soa的思想和跨界迁移,理解起来也不是很复杂,核心是uddi。
第三:数据表结构可扩展;
数据表结构可扩展,很多人认为就自定义字段,这个只是表段扩展的初级阶,为什么呢?因为一个信息的属性到底有多少,开发人员是不可预测的,动态改变数据表 结构是一作个非常危险的动,现在很多架构师提出来应该是独享表结构而共享数据库,但是你可以想象,举例:一个租户的两个用户,a用户insert数据,b 用户在alter表结构,这是一个高风险度的操作。所以建议不要这样做,而是采用视图进行行列装换的策略,这个应用最好的算是facebook,给每个被 扩展的数据表,建立扩展数据表, 表数据如果下:
被扩展数据表A
primaryidname
1测试1

这个数据表很容易理解,就是信息的基础数据表,比如name。
数据表A的扩展记录表
A_extend

primaryidfieldtypelengthdescript......
1numberint10数量
2addtimedate
上架时间

这个数据表和基础数据表应该是一一对应的关系,记录扩展信息,简单的应用就是上边的这种,复杂的应用比如产品可能根据不同的分类所扩展的还有所不一样,这个数据表中就可以进行处理。
数据表A的扩展数据表
A_extend_data

Aidfieldintvarchardate......
1number1234


1addtime

17:49:22

这个数据表是该思路的核心,列是field和数据类型的集合,一条扩展信息,根据属性划分成多行,这样避免数据表结构的更改,但是又有一个新的问题 就是在这些扩展属性上进行检索的时候就非常困难,下边的视图解决这个问题。这里还有一个问题就是:为什么不设计成一个混合类型的字段,那样不是更加简单 吗?还要按照类型进行分开存储,实际上每行只有一个存储有效单元,其他都是null,这个主要是为了提供更多的检索条件,因为数字123和字符123存储 显然不一样的,数字123可以用>比较符,而字符123则是无意义的。同理在该表上建立的视图也就有清晰的类型,和应用系统中的类型相匹配,而不在 需要转换。当然你的应用系统如果是php这样的弱类型语言,那就多余了。
在A_extend_data创建视图A_extend_data_view

primaryidnumberaddtime
1123417:49:22
2234217:49:25
视图,这个就很清晰了,检索的时候也很方便,和一般的数据表检索是没有什么两样,在创建视图的时候,用一个存储过程,进行行列转换。





/**/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[product_base]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[product_base]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[product_extend]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[product_extend]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[product_extend_data]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[product_extend_data]
GO


CREATE TABLE [dbo].[product_base] (
[product_base_id] [int] NOT NULL ,
[product_base_name] [nvarchar] (200) COLLATE Chinese_PRC_CI_AS NULL ,
[product_base_price] [float] NULL ,
[product_base_num] [int] NULL ,
[product_base_desc] [nvarchar] (1000) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[product_extend] (
[product_extend_id] [int] NOT NULL ,
[product_extend_ename] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[product_extend_cname] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[product_extend_type] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[product_extend_length] [int] NOT NULL ,
[product_extend_unit] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[product_extend_desc] [nvarchar] (1000) COLLATE Chinese_PRC_CI_AS NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[product_extend_data] (
[product_extend_data_id] [int] IDENTITY (1, 1) NOT NULL ,
[product_extend_data_field_product_id] [int] NULL ,
[product_extend_data_field_id] [int] NULL ,
[product_extend_data_ename] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[product_extend_data_cname] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[product_extend_data_int] [int] NULL ,
[product_extend_data_bit] [bit] NULL ,
[product_extend_data_float] [float] NULL ,
[product_extend_data_datetime] [datetime] NULL ,
[product_extend_data_ntext] [ntext] COLLATE Chinese_PRC_CI_AS NULL ,
[product_extend_data_nvarchar] [nvarchar] (4000) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
-------


--Table:product_base(*)
insert into product_base(*) ( product_base_id, product_base_name, product_base_price, product_base_num, product_base_desc) values
( 1, 't60' , 3700, 1, 'ibm t60笔记本 高分' )
insert into product_base(*) ( product_base_id, product_base_name, product_base_price, product_base_num, product_base_desc) values
( 2, 't43p' , 3100, 1, 'ibm t43p笔记本 高分' )

--Table:product_extend(*)
insert into product_extend(*) ( product_extend_id, product_extend_ename, product_extend_cname, product_extend_type, product_extend_length, product_extend_unit, product_extend_desc) values
( 1, 'cpu' , 'cpu' , 'nvarchar' , 50, 'hz' , 'cpu' )
insert into product_extend(*) ( product_extend_id, product_extend_ename, product_extend_cname, product_extend_type, product_extend_length, product_extend_unit, product_extend_desc) values
( 2, 'memory' , '内存' , 'int' , 0, 'mb' , '内存' )
insert into product_extend(*) ( product_extend_id, product_extend_ename, product_extend_cname, product_extend_type, product_extend_length, product_extend_unit, product_extend_desc) values
( 3, 'disk' , '硬盘' , 'int' , 0, 'g' , '硬盘' )

--Table:product_extend_data(*)
insert into product_extend_data(*) ( product_extend_data_field_product_id, product_extend_data_field_id, product_extend_data_ename, product_extend_data_cname, product_extend_data_int, product_extend_data_bit, product_extend_data_float, product_extend_data_datetime, product_extend_data_ntext, product_extend_data_nvarchar) values
( 1, 1, 'cpu' , 'cpu' , null , null , null , null , '' , '2.13' )
insert into product_extend_data(*) ( product_extend_data_field_product_id, product_extend_data_field_id, product_extend_data_ename, product_extend_data_cname, product_extend_data_int, product_extend_data_bit, product_extend_data_float, product_extend_data_datetime, product_extend_data_ntext, product_extend_data_nvarchar) values
( 1, 2, 'memory' , '内存' , 1024, null , null , null , '' , '' )
insert into product_extend_data(*) ( product_extend_data_field_product_id, product_extend_data_field_id, product_extend_data_ename, product_extend_data_cname, product_extend_data_int, product_extend_data_bit, product_extend_data_float, product_extend_data_datetime, product_extend_data_ntext, product_extend_data_nvarchar) values
( 1, 3, 'disk' , '硬盘' , 250, null , null , null , '' , '' )
insert into product_extend_data(*) ( product_extend_data_field_product_id, product_extend_data_field_id, product_extend_data_ename, product_extend_data_cname, product_extend_data_int, product_extend_data_bit, product_extend_data_float, product_extend_data_datetime, product_extend_data_ntext, product_extend_data_nvarchar) values
( 2, 1, 'cpu' , 'cpu' , null , null , null , null , '' , '2.13' )
insert into product_extend_data(*) ( product_extend_data_field_product_id, product_extend_data_field_id, product_extend_data_ename, product_extend_data_cname, product_extend_data_int, product_extend_data_bit, product_extend_data_float, product_extend_data_datetime, product_extend_data_ntext, product_extend_data_nvarchar) values
( 2, 2, 'memory' , '内存' , 1024, null , null , null , '' , '' )
insert into product_extend_data(*) ( product_extend_data_field_product_id, product_extend_data_field_id, product_extend_data_ename, product_extend_data_cname, product_extend_data_int, product_extend_data_bit, product_extend_data_float, product_extend_data_datetime, product_extend_data_ntext, product_extend_data_nvarchar) values
( 2, 3, 'disk' , '硬盘' , 250, null , null , null , '' , '' )



-------
select (select [product_base_name] from [product_base] where   [product_base_id] = [product_extend_data_field_product_id]) as pname
,max(case [product_extend_data_ename] when 'cpu' then [product_extend_data_nvarchar] end )as [cpu]
,max(case [product_extend_data_ename] when 'memory' then [product_extend_data_int] end )as [memory]
,max(case [product_extend_data_ename] when 'disk' then [product_extend_data_int] end )as [disk]
from [product_extend_data]
group by [product_extend_data_field_product_id]
转:http://hi.baidu.com/luchaoshuai/blog/item/1d6742faf889ad9e58ee902e.html

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/118838/viewspace-735009/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/118838/viewspace-735009/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值