关于更松散开放的数据结构的意淫

首先描述一下我所遇到的问题:
两年前我开始为公司编写自己使用的"ERP", 之所以为"ERP"加上引号, 是因为不想被同行或更为专业的人士抨击.

 

两年前公司的外贸业务也刚刚起步, 所以这个"ERP"的成长过程, 也就是公司业务发展的变更过程.

从一开始的简单的产品信息入库, 到在线订单, 订单管理, 采购管理, 发货管理, 库存管理, 生产管理, 到现在正在进行的"供应链"的整合.

这同时也是一个程序员挠破脑袋的一部血泪史.

 

因为以前没有做过这样的系统, 所以开始的时候对后面的需求预估很不充分, 造成的结果就是, 每次需求发生改变的时候, 多会发现之前的数据库结构设计不合理.

表名, 字段名, 数据类型设计不合理, 等等.

但是为了维持原有的数据, 业务不中断, 避免大规模的更新升级, 一直是缝缝补补, 不停得加字段, 改字段, 加表, 改表.

 

每次更新都要从前端的JS, 表现层, 业务层, 数据层, 数据库结构统统改一遍, 不胜其烦.

 

我个人熟悉使用JavaScript, 其实仅就语言风格和"语法糖"来说, Javascript是我最喜欢的语言.

所以有时候会想, 如果更改需求只需要修改js就好了, 一个object, 有某个属性的时候就获得, 以前没有定义过的属性, 他会告诉你是null, 而且这并不妨碍你随时为他加上任意一个类型的属性, 甚至可以是一个function.

直接赋值数据, 直接提取数据, 不需要修改类结构, 不需要声明, 不需要管他怎么存储(数据库结构).

 

这个时候, 会有朋友跳出来说, 那整个项目会乱套的, 没有人知道什么数据是什么结构, 什么逻辑. 因为没有了对象结构的定义!

我弱弱地说一句: 是否可以作些简单的文档说明呢. 这里最主要的就是一个类结构的问题, 其实只要及时更新文档, 写明哪些实体包含哪些属性, 属性的变量名是什么就可以了.

 

我想至少在单人开发的小项目中, 尤其是需求变更特别厉害的项目, 这种方法应该很好的吧??

 

另外这个想法还得益于对wordpress的一些简单解读.

wordpress的数据库结构很简单, 几乎所有的实体都存在一个wp_post表里, 而这个表也只有一些最基础最简单的字段. 其他的扩展实体属性(Plugin后加上的), 全都在一个统一的附属表wp_post_meta里面. key=>value. 真简洁!

 

业务的变更只需要改仅少量的代码, 不需要修改数据库结构. 真好.

当然这样付出的代价应该是性能吧, 需要大量的left join.

不过, 小应用中, 这点性能的牺牲, 又算得上什么呢.

 

意淫一把, 继续痛苦的修改.  希望哪天哪个公司能够出个不需要定义表结构的数据库.....

posted @ 2010-03-20 17:52 疯子阿飞 阅读(1320) 评论(6) 编辑 收藏

 回复 引用 查看   
#1楼2010-03-20 18:35 | 螃蟹往前冲      
可以参考一下IBM的MAXIMO的设计
 回复 引用 查看   
#2楼2010-03-20 19:06 | Jeffrey Hua      
冲着意淫这个词过来的。
看完了,没有意淫的欲望。

 回复 引用 查看   
#3楼2010-03-20 20:45 | 启军      
呵呵,你不是在YY,已经有这样的系统了.比如Cassandra,

Cassandra是一个混合型的非关系的数据库,类似于Google的BigTable。其主要功能比Dynomite(分布式的Key-Value存 储系统)更丰富,但支持度却不如文档存储MongoDB(介于关系数据库和非关系数据库之间的开源产品,是非关系数据库当中功能最丰富,最像关系数据库 的。支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。)Cassandra最初由Facebook开发,后转 变成了开源项目。它是一个网络社交云计算方面理想的数据库。以Amazon专有的完全分布式的Dynamo为基础,结合了Google BigTable基于列族(Column Family)的数据模型。P2P去中心化的存储。很多方面都可以称之为Dynamo 2.0。
-------
http://linux.cn/home/space.php?uid=4646&do=thread&id=2250

 回复 引用 查看   
#4楼2010-03-21 08:10 | cncolder      
Cassandra 还太嫩
MongoDB 成熟度高些

不过这类东西需要你先打破常规才行, 习惯于关系型数据库是很难接受他们的.

比如你可以建一个"表"叫Item, 自动建立(On fly), 数据结构是不需要事先设计好的, 然后往里放什么都行, 没有"列"的限制, 熟悉 Javascript 一定知道 JSON 吧, 就是像 JSON 那样的数据结构, 统统放进去, 属性值还可以是数据组或哈希, 数组还能建立"索引".

交互Shell里的操作语法也是javascript, 还能用javascript扩展服务端功能.
但是不知道你的服务端是拿什么语言写的, 你可以去看看有没有适合你的Driver
http://www.mongodb.org/display/DOCS/Drivers

 回复 引用 查看   
#5楼[楼主]2010-03-22 08:37 | 疯子阿飞      
好兴奋啊,

没想到自己的意淫也能引来这么多高手论道, 真是打开眼界, 看来自己真的是只知埋头代码, 太孤陋而寡闻了.

 回复 引用 查看   
#6楼2010-10-20 12:10 | 飞鸽传书官方网站      
考虑下查询速度。实现方式固然不少,性能才是最重要的。