在我们的一些应用中,我们可能不能完全设想到用户需要什么样的属性。比如给你一个用户个人信息记录页面,你可能能想到常用的信息,比如
用户名 |
xxxxx |
邮箱 |
xxxx@xxxxx.com |
电话 |
13xxxxxxxxx |
但后来用户发现,他可能想记录下自己工作的地址,这样可以方便别人找到自己,那怎么办呢?我们系统开始没有设计这个属性呢。这时候,我们就需要一种方案来轻松的让用户扩展属性。目前gmail的联系人里面就有这个功能。我们的扩展不能去修改原来的表结构,那样不安全,而且由于每个人的需求不一样,很难做到满足大众的个性化需求。这样,我们可以设计一个表来专门支持属性扩展。
我们设计的表 结构如下,(oracle)
create table C_Dic
(
/* 主键 */
id Integer not null,
/* 表名 */
tableName varchar2(50) null,
/* 所扩展表的主键,可以两种格式存储,json和索引算法。
json 格式简单,易读,但查询效率较低,索引算法生成的串不可读
,
但效率较高。 比如, md5(table+ k1 + k2)
*/
"key" varchar2(254) null,
/* 所扩展表最原始的可以值。json格式。 */
keys varchar2(254) null,
/* 扩展的属性名, 用来取得数据, 以备可能的查询使用。 */
fieldName varchar2(64) null,
/* 扩展的属性的现实名称。用来向用户显示。 */
disName varchar2(64) null,
/* 属性值 */
value varchar2(1024) null,
created Date null,
modifiled Date null,
constraint PK_C_DIC primary key clustered (id)
);
其中要特别注意, key 属性用来存储的是一个 根据表名、主键值生成的一个字符串,这样可以简化在字典表中的记录,但不易于读取,所以我们用keys属性来存储可读的主键值, 采用json格式存储。
下面我们来看一个例子, 扩展用户(c_user)的地址和角色资源(c_role_res)的创建者,
这样就完成了属性扩展工作了。那么我们该怎样获取扩展的属性呢? 很简单 , 先计算 md5(table_name + k1 + k2), 的值 ,
比如用户表c_user就计算 md5(‘c_user’ + 1), 这样就的到一个值, 然后 通过
select fieldName, disName, value from C_Dic where
tableName='c_user' and key = '计算的md5值'
来获取给这条记录扩展的属性属性值。
至此。基本就完成了这个可扩展属性的设计工作。
作者:http://idocbox.com