比如有个Book表,有id, name, isbn等列表示基本信息,但是不同的商家对Book表有不同的其他需求,有的还需要A属性,有的则还需要B属性,或者说某一天随着需求变化,我们要扩展Book的信息,但又不希望以加列的方式更改Book表,应如何设计呢?
设置不同的角色呀
还可以在加个视图
最简单的办法,创建一个BookField表,里面3个字段:BookId、FieldName、FieldValue,做个映射关系就好了
复杂的话再去扩展,包括设置字段类型、默认值什么的
就算2l那样的.不加列当然就加行.
能具体点吗,最好有个图说明一下
对于关系型数据库来说,要实现你说的问题,用2楼 balahoho 的方案是可以的,
三个表:
bookBase(bid, bname, 等常用的基础信息),
bookExtendField(bid,fid,fieldname-扩展字段名,fieldtype-扩展字段类型,等扩展字段的信息),
bookExtendValue(bid,fid,fvalue,等扩展字段值的信息)
其实对于关系型数据库来说,对字段变化本来就不是特别的友好,
要么就是设计的时候严格按照三范式设计,这样可以比较方便的通过给表加字段的方式扩展,但是你要求的是不通过给表加字段的方式
要么就是前面说的这种,用专门的表存储字段信息,这么做在查询的时候就要先查询有那些字段,再根据这些字段取值,这样会使查询变的麻烦,
所以如果你的字段变化预期会很大,可以考虑使用非关系型数据库,比如mongo,字段扩展直接加就行,
但是需要注意的是,mongo对多表关联查询的支持不是很好,
专门弄一列里面存json类型或者xml类型的值就好了,现在最新版本的各种关系型数据库里面都有对json的原生支持了
其实如果想把业务系统产品化就需要对业务高度抽象化 你不应该去适应个别业务 应该让业务适应你
或者你就不要做业务系统 做业务框架引擎 所有的表单和数据库都动态生成 然后进行2次开发 类似于freemarker
转自:http://www.iteye.com/problems/59252
读取表格的内容:DataTable Dt
创建一个视图
DataView dv = Dt.DefaultView;
利用视图中的属性显示客户需要的数据
链接:http://www.360doc.com/content/11/1201/21/4509122_169008079.shtml
给表设置角色,添加视图
可以添加一个字段配置表,做好表和字段直接的关联映射。
或者可以不按表字段存储,所有属性以json存储。
我是这样想的,那些基本字段,肯定是要有的。某些客户的变态字段可以在建一个一对一关联表。每家用户都有一个不同的子表,这样怎么样
或者尝试下nosql数据库
以前看到过一个文章,说是可以预留字段,多增加几列,string1/string2/string3.......,加个二十列预备着。用的时候文档记录每列对应哪个角色或谁用。也是种方法,可以参考下
类似OA,基础表
客户A表,客户B表,客户C表.
Book 表-t_book (id,name ,商家_id,isbn)
BookProps表 t_book_props (id , book_id , name ,value) 这张表 作用其实和Map 类似,name 为键 value 为值
具体逻辑: 一个商家在book 表中对应一条相应的 记录,在t_book_props 表中对应存放该商家的设置book的属性信息。要想获取到某个商家自定义设计的A,B。。等属性 .sql如下: select tp.* from t_book tb , t_book_props tp where tp.book_id = tb.id and tb.商家_id = ?
一个表足矣,
Book: ID, Name,isbn等必要信息+ JsonDescription(其他额外信息,序列化对象)