码迷,mamicode.com
首页 > 数据库 > 详细

数据库动态扩展字段

时间:2018-01-07 23:26:30      阅读:304      评论:0      收藏:0      [点我收藏+]

标签:慢慢   9.png   自己   支持   格式   系统设计   需要   动态扩展   属性   

     最近在负责一个平台,需要和不同系统进行对接,需要用到数据库的动态扩展字段。

     现在比较流行的扩展字段方法,有大概如下把,①预留很多列进行扩展,②使用版本号的方式来进行扩展,③使用Key+Value的形式进行扩展。下面我讲讲我对这几种方法的看法。

     可能很多人会问,你要增加一个字段,那不就直接在数据库里的对应表加就结了,哪有什么扩展的设计呀,哪天要加字段了就加呗,可以为空就为空,不可以给个默认值完事。确实是这么简单,添加一个字段如果是允许为可空类型确实是一点问题都没有。如果你添加一个字段需要不允许为空,然后又在1KW左右的数据量表里面添加的时候,就可能需要花费很长时间,当然这些操作都可以在夜深人静的时候加(加完之后,改一下代码这个也能做好)

     (一)为可能需要扩展的表,预留一些字段

          数据库预留一些字段,就是以防万一,防患于未然,等到需要的时候,就不需要在表中增加新的字段了,而且这么做的话,一个表里面的数据应该是存储在相邻的物理空间。其实这个问题是不是真的解决我们的需要呢,因为预留字段的特点是col1,col2这种命名,是不是很好维护了,等过了几年再来看这个是否合理呢。

           上面这种就是属于“过度设计”,我们应该做的就是按需设计。

     (二)使用版本号+通用列的方式来进行扩展

        技术分享图片

 

         类似于这种0,如果有字段变更的话,用一个通用列来进行存储,但是用这种结构特别不好,不过SQL Server2016已经支持Json格式了,所以也慢慢得变得可行了。

     (三) 使用Key+Value的方式进行扩展

         下面说说,我最常用的Key+Value方式来进行动态扩展。

         拿最近涉及到的业务系统来举例子,对于不同用户

         技术分享图片

       下面重点讲讲我们这个的做法把,最初的做法是一个用户基础表(UserBase),然后分别为每个系统设计对应的表。比如对应业务系统A(AEX(扩展表),BEX类似于这样。因为对我们整个平台来说,每个业务系统,关注的属性都是不一样,并且都是不确定的,每个业务系统都有自己的业务属性。根据这些情况,我们就把AEX设计成了可扩展的表形式(AEX(主键Id,UserId,Key,Value))。一开始我们是这样设计的,写代码的时候,你会发现我们太依赖这个KEY值了,需要用到KEY值对应的Value的时候,都是拿KEY值对应的内容来进行比较,并且KEY值也不能太长,太长会给我们造成负担。所以我们有了改进的版本,就是要摆脱这种依赖关系。

      摆脱依赖的方法,在面向对象设计,最普通的就是引入第三者,没错,我们需要引入一个专门的配置表来管理这些KEY值,暂且就叫KeyConfig表(Id ,KeyName)  AEX(主键Id,UserId,KeyId,Value)。那么相对应的Value如果有多个值,也可以设置一个ValueConfig表来存储。这些变化都需要根据业务来进行取舍。

     

          

 

     

数据库动态扩展字段

标签:慢慢   9.png   自己   支持   格式   系统设计   需要   动态扩展   属性   

原文地址:https://www.cnblogs.com/gdouzz/p/8227787.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!