`
argan
  • 浏览: 129634 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

如何应对表结构经常变化?

阅读更多

作为架构师或者开发人员,面对业务方提出的数据结构变化的需求总是很头痛的,今天让你加个描述字段,明天让你再加个什么标记,后天又需要增加一个时间戳,千奇百怪,层出不穷,实在头痛。但是,我们不能随意的指责什么,因为业务在发展,而且我们不能也不应该因为技术或者实现的原因去否决一些业务变化,毕竟技术是什么?真正产生价值的还是业务!

 

那,在实践中,我们如何面对这种无法避免而且往往很难预期的数据结构变化呢?

 

第一种方法,预留字段

既然很难加字段,就预先留好一些备用,比如加上10个Date,20个VARCHAR,10个Number之类的,虽然看起来猥琐了点,而且没那么灵活,其实还是很实用的,生产中也有不少人使用,不过因为预先留的字段一般是没什么含义的,需要有额外的信息来描述他,COL1是什么含义,COL2是什么含义,演变到后来有的就干脆更极端,所有字段都是无意义的名字,全靠外部的meta信息来描述,这种用法据我所知至少有三个地方在使用,两个是我亲自听到设计者描述的,另一个是别人告诉我的

 

不管怎样,预留字段的方式还是很解决很多问题的,而且基本不影响性能,除了额外的meta信息描述外,也没有其他的负担。

 

第二种方法,使用复杂字段

这个应用的场景不是很多,在某些特殊要求下还是很有用的,比如,某个业务实体(某张表),有一些标记位,都是true/false之类的标记,可以理解为这个实体的一些属性,经常需要添加,这种情况,在生产中我们使用过用一个数字,按位来表示这些标记的,比如第三位表示他是不是付费用户,第四位表示他是合作方来的用户还是自己注册的,等等。还有一种情况,需要更复杂的属性列表,属性个数经常变,可以考虑使用一个文本字段,保存结构化的数据,比如自己定义一个xml的格式

 

使用复杂字段的好处就在于比较灵活,同一类型的数据可以放在一起(实际上相当于把应该是一个关联表的数据放一个字段里了),操作的性能也不错,但是复杂字段里面的内容查询比较困难

 

还有一种方法,将数据的存储和索引(需要查询的内容)分开存放,相当于主表就一个key-value,value就是一个大的xml(或者其他的一坨),把需要查询的字段放到其他单独的表里去,可以参考friendfeed如何使用mysql,这是一个实际的例子。实际上在02-03年的时候,老是面对这样的问题,我就在考虑这样的方案,我当初的想法是,用bdb来存储数据(就是那个key-value)了,要检索的数据放到lucene里去,但是因为那个系统对实时性的要求而没法实施,但是并不是每个系统都要求这么实时的,在有些地方还是可以考虑使用的

 

另外,还有column based db,也可以很好的解决这个问题,实际上他就本本回避了加字段的问题,不过现在似乎没有性能很好的实现

 

上面这些方案的,都有局限性,选用的时候要看场景的,而且有可能今天作出的决定是对的,过了两年就变的不适合了,事情总是在变化的嘛...

分享到:
评论
15 楼 zhanglian123 2009-12-30  
预留字段最省事,改起来最快;
我们一般都是这样做;每种类型预留10个;
另外一种,我们也采用就是设计一张关联表,
假设有A,B;两张独立表;设计一张C将他们关联起来;
A,B存放各自信息;C表只存放关联关系.
不过个人意见,如果时间比较充足,还是重新设计表,可能这样改动量比较大
14 楼 ltian 2009-12-30  
x03570227 写道
好的设计不会出现表结构经常变化的问题,LZ反省下吧(只大致浏览了下内容,没仔细看)


       大多数好的设计设计源于对业务的全面把握。对业务的不熟悉,肯定不会产出具有前瞻性的设计,因此就会出现库表结构的不停变化。多数情况,客户的核心业务不会经常剧烈变化,据我所知的电信,电力,人财物都已经有一些国际的业务标准模型。
当然,楼主的情况也可能是因为楼主已经达到领域知识的最前沿,而且该领域目前核心业务正处于激烈变化之中。
13 楼 三问飞絮 2009-12-30  
现在在做行业软件的项目中,这情改动的情况是非常的普遍。
现在的客户信息部门即要求使用方案一,即预留字段。将来这引起字段的含意非常的模糊难懂。

但是个人不大赞同使用这种方法。同意pf_miles的观点,不为未来而设计。
能做的则是,收紧数据库改动的权限,控制好改动的的评审。
12 楼 kunee 2009-12-30  
你太搞了吧。。。表模型经常变化,咋设计的

经常变化内容就该用纵表。

偶们电信行业的业务描述那么复杂,也不会经常变化,再说模型一动是需要层层审批的,天天改谁受得了,10000多张表这么改早就死了

要抽象,看SAP多牛逼
11 楼 pipilu 2009-12-30  
我见过预留字段的设计,但一直没想明白有什么必要?预留字段肯定应对的不会是新增的控制信息(比如状态之类的控制字段)。那如果以后有新增信息,我再加上不行么?我一直以为,这种(预留字段的)设计是过去PowerBuilder开发时代遗留下来的,现在已经不必要了。借地盘正好问一下这种理解对不对。

第二种方法干脆把第一范式都给颠覆了。如果那样的话,我都不知道还用关系数据库干啥?
用key-value的方式倒是适应灵活性需求的通用办法。
10 楼 JBeans 2009-12-30  
用元数据容器
9 楼 xunmi2009 2009-12-30  
如果需求变换,需要扩充功能,再好的设计也无法阻止表结构的变化,除非你能让客户不提这个需求或设计表时就能知道客户未来可能需要的全部功能,我上家公司的做法就是预留类型为varchar的备用字段,这个确实能应付一段时间的变化。不过我也在思索有什么更好的方法去应对时时变更的需求。
8 楼 nethaoke 2009-12-29  
基于元数据的配置技术 方便修改 升级。  建议看看compiere的思想
7 楼 binlaniua 2009-12-29  
现在的数据库应该都支持正则表达式查询吧
6 楼 zzsczz 2009-12-29  
要么能够多收钱  也就认了。 要么去死吧。

设计业务流程规范用户操作。计算机模型就是  输入  处理 输出。至于持久化的实现是很技术的问题,和业务没有关系。

至于“表结构经常变化”    要么是业务没搞清楚,要么就是方向错误。
5 楼 pf_miles 2009-12-29  
agan??
我的看法是..数据库设计不为了“未来”而设计,所以我反对“预留字段”的方法;
依我个人的经验上讲,表结构做到3范式,并且任何字段都不带结构(只是一个意义单一的值而已),总体来说这样的数据库设计是很好扩展的;
“很好扩展”基本上是指如果业务要新增概念,那么只需要通过添加字段或者添加新表完成扩展,而不是更改字段本身或者删除字段(有点“开闭原则”的意思,我觉得不管是对象设计还是数据库设计这点是部分共通的)
看得出来你已经对这些“很好扩展”的扩展进行抱怨了;
确实,如果业务变化很快,那么就算变化朝着正常方向发展(只增不删改),也不免会让人觉得烦;
我觉得这种烦恼很大部分是因为我们不仅在代码中维护了所有的业务概念,同时在关系型数据库表中也维护了一份业务概念——我们要具体到某个字段来存储,表结构实际上非常具体地展现了业务数据——这就导致业务一变,除了代码要变之外,数据库表结构也可能变;
这样我觉得有意思的事情就来了:你需要用数据库进行关系运算么?
数据库表非常具体地展现了所有的业务字段细节,为的是做关系运算,比如连接查询;
简单看了一下你提到的“复杂字段”和后面的“key-value”方案,如果这样的方案能满足你的业务需要,那么说明你的业务是不需要数据库做关系运算的,进而也不需要关系型数据库了...所以这里你不妨考虑一下对象数据库
就像bigTable一样,所有的东西都有一个identity取出来,以一个对象的形式,所有的业务逻辑就只存在于代码中
4 楼 argan 2009-12-26  
x03570227 写道
好的设计不会出现表结构经常变化的问题,LZ反省下吧(只大致浏览了下内容,没仔细看)


任何“好的设计”都是短暂的,因为业务总在变化,否则的话,我们现在还写什么程序呢,用以前好的设计就可以了啊,这是极端了

现实中是,如果你的系统支持的是一个不太稳定的业务,那就必然会面临这个问题的
3 楼 x03570227 2009-12-25  
好的设计不会出现表结构经常变化的问题,LZ反省下吧(只大致浏览了下内容,没仔细看)
2 楼 willko 2009-12-25  
friendfeed用mysql实现key-value存储主要是解决在线ddl锁表影响ha的问题
1 楼 neusoft 2009-12-25  
正在弄oracle的 xml db 不知道能否搞定,从目前的情况来看 字段变了,从前(界面)到后(逻辑),全变,谁让你不是做产品的,做解决方案只能怪自己命不好 老老实实改吧,逃不掉的!!

相关推荐

    realm 数据库升级 goole数据库表结构字段查看

    在Android开发中,Realm是一个流行的本地对象关系映射(ORM)解决方案,它为移动设备提供...通过学习和实践这些知识点,开发者能够更有效地管理和维护 Realm 数据库,同时理解如何在遇到数据库结构变化时进行妥善处理。

    山洪灾害专题数据库表结构及数据上报技术要求

    ### 山洪灾害专题数据库表结构及数据上报技术要求解析 #### 一、核心知识点概述 山洪灾害专题数据库表结构及数据上报技术要求是一份技术文档,旨在规范山洪灾害监测预警平台的建设和数据上报流程,确保县级平台...

    EZDML表结构设计器

    在数据库设计领域,一款好的工具能显著提升工作效率,EZDML表结构设计器显然致力于此,通过提供易用且功能丰富的界面,帮助用户轻松应对复杂的数据库设计挑战。无论是初学者还是经验丰富的专业人士,都能从中受益。

    DatabaseManager,结合 ormlite,实现本地数据库结构的自动升级。当数据库表有变化时(包括增加表或者已有表列的变化),无需添加任何升级相关的代码,只需增加数据库版本号即可。当然,如果需要自定义表结构升级逻辑,也可重写默认的升级方案。.zip

    当数据库表结构发生变化,如增加新表或修改已有表的列,DatabaseManager提供了一种优雅的处理方式。开发者无需再为每个版本变更编写特定的升级代码,只需要简单地增加数据库的版本号。系统会自动检测当前数据库版本...

    SQL Server中数据库表结构的动态修改 (1).pdf

    随着业务需求的变化,数据库表结构的动态修改变得不可或缺。本文主要探讨如何在 SQL Server 中通过数据字典和存储过程来实现这一功能,以提高系统的灵活性和适应性。 数据字典是数据库设计者的重要文档,记录了...

    全国省市县数据库sql带表结构,城市下含有市辖区

    描述中的“可应对以后新增的区”意味着这个数据库设计时已经预见到了行政区划的变化,可能包含了对未来可能出现的新区预留了空间,比如添加新数据或者扩展表结构,以保证数据库的持久性和适应性。 标签“省市县”...

    基于JSP和MySQL的动态表结构的设计与实现.pdf

    作者设计了一种可动态维护的表结构,通过JSP的编程能力,实现对数据库表的动态创建、修改和删除,确保了系统能够适应未来的需求变化。 在实际开发过程中,作者强调了系统的实用性和维护便利性。通过JSP的内置动作和...

    sqlserver 2008手工修改表结构,表不能保存的问题与解决方法

    这个选项默认可能是勾选状态,它防止用户进行可能导致表结构大幅变化的修改,因为这类修改通常需要重建整个表,这可能会导致数据丢失。为了允许保存表结构的修改,需要取消勾选这个复选框,然后点击“确定”保存设置...

    变化识别与风险评价表参照.pdf

    变化识别与风险评价是企业在日常运营中不可或缺的一个环节,它涉及到组织结构、人员配置、生产流程、技术应用、法规遵循以及与合作伙伴关系等多个层面。在上述提到的“变化识别与风险评价表参照.pdf”文件中,我们...

    ChatGPT技术如何应对用户情绪变化问题.docx

    ChatGPT技术在应对用户情绪变化方面展示了人工智能在自然语言处理领域的进步。用户情绪识别是这一过程中的关键步骤,ChatGPT需要通过分析用户的言语特征,如词汇选择、语调和句子结构,来判断用户的情绪状态。这通常...

    中国近代经济结构的变化PPT学习教案.pptx

    2. 自然经济的解体:自然经济的解体是中国近代经济结构变化的重要特征,表现为耕织分离和纺织分离,这使得大量劳动力从农业生产中释放出来,为新兴的工业提供了劳动力资源,同时也促使中国逐渐成为西方国家的原料...

    消费者意识变化分析表模板.doc

    在现代商业环境中,消费者意识的变化是企业成功的关键因素之一。"消费者意识变化分析表模板.doc" 提供了..."消费者意识变化分析表模板"提供了一种工具,帮助企业系统地理解和应对这些变化,从而在管理决策中占据优势。

    EXCEL 结构用表全集

    这有助于跟踪和更新整个结构设计的信息,例如材料规格、荷载变化等。 5. **可视化工具**:Excel还可以创建图表和图形,帮助设计师直观理解结构性能。比如,应力分布图、弯矩图等,通过颜色编码和线条表示,使结果...

    高中历史之教学教研各类型主观题黄金法则:变化型素材

    5. **组织答案**:结构化地呈现答案,清晰表述变化前后的情况,并给出相应的理由。 在教研过程中,教师应注重培养学生的史料分析能力,引导他们从不同角度观察历史,训练他们从繁杂的信息中提炼关键点。同时,通过...

    进销存需求文档(包含表结构设计)(实用应用文).doc

    表结构设计是进销存管理系统的基础,通常包括但不限于以下表格: - 商品表:存储商品的基本信息,如商品ID、名称、类别、供应商、价格等。 - 库存表:记录商品的库存数量、入库日期、出库日期等。 - 订单表:保存...

    2.38 单个风险应对计划表.doc

    通过定期审查和更新,团队可以持续监控风险状况,并根据项目进展和外部环境的变化调整应对策略。此外,有效的沟通和培训也是确保所有团队成员理解和执行风险应对计划的关键。 总结来说,"2.38 单个风险应对计划表....

    消费者意识变化分析表.doc

    "消费者意识变化分析表.doc"着重探讨了几个核心领域,旨在帮助企业理解这些变化,并采取相应的策略来适应市场。以下是对这些关键点的详细解读: 1. **消费者社会构造的变化**: - **高龄化社会**:随着人口结构的...

    消费者意识变化分析表(表格模板、DOC格式).doc

    消费者意识变化分析表是一种工具,帮助企业理解并适应这些变化,以确保其产品和服务能够满足不断演变的市场需求。以下是基于标题、描述和部分内容的关键知识点的详细说明: 1. **消费者社会构造的变化**:社会结构...

    sql2008修改阻止保存要求重新创建表的更改

    - **备份数据**:在进行任何可能导致数据表结构变化的操作前,请务必先做好数据备份,以避免因操作失误而导致的数据丢失。 - **了解更改的影响**:在取消上述保护选项之前,请确保充分理解所做的修改可能对现有数据...

Global site tag (gtag.js) - Google Analytics