俺在开发之前, 要对数据表的结构进行设计, 但遇到了一难题, 想请教各位大哥问题:
    在开发过程中, 因为某种原因, 要对已经设计好的数据表结构增加一个字段, 在不允许修改原表的结构的情况下, 如何解决呢??举例: 一个商品表, 有这样的结构: 商品ID, 商品名字, 商品规格, 但是在开发的过程中, 有需要为商品表增加一个字段: 商品价格, (而且以后会有可能不定时地继续增加一些新的属性字段, 例如商品的长度, 宽度等) 由于已经有很多的程序都使用了之前的表结构, 现在不允许修改原来的表结构, 想请问有什么办法可以解决??如果可以通过新建表来解决上面的问题, 应该如何设计呢??  新建的表中, 是否可以解决引用外键的问题呢?? 相关帖子:(100分) http://community.csdn.net/Expert/topic/4622/4622502.xml?temp=.2389795可以拷贝一份您的答案到上面的帖子中, 如果能够解决该问题, 也方便俺送分给大哥 :-)望各位大哥, 不吝赐教, 谢谢!!!

解决方案 »

  1.   

    你以商品ID为主键再创建一个新表,到调用数据时,只需改SQL语句就行了
      

  2.   

    cattleknife(解牛刀) :
    谢谢您的回答, 按您所说的, 如果我以后要再新增一个字段, 是否又以 商品ID 为主键另建一个表呢?? 显示这种方法行不通
      

  3.   

    cattleknife(解牛刀): 
        谢谢您的回答, 假设您的方案对于存储数据能够行得通(先不讨论是否所有的类型都能正常转换为字符串), 但是如果用户要对数据表的数据进行查找的话,例如: 用户要查找商品价格在某个范围里面的数据, 正常条件应该是 Price >= 某个最小值 and Price <= 某个最大值, 但是因为在数据表中的数据全部都是字符串, 没办法实现用户的查询要求.显然您的方案行不通, 再次谢谢您的回答 :-)
      

  4.   

    将新增的字段放在表的最后面,并设为空值,
    如有业务需要就通过update修改来统一整个表的(新增字段)值
    这样就不破环表结构啦,源程序也不用做任何改动!需求是在开发过程中算不上频繁改动,但也免不了改动,
    如每新增一个字段就新建一张表进行关联,读取数据的速度不说,
    给自己的开发也会带来不必要的麻烦!
      

  5.   

    1可以将新增的栏位放在后面,不过以前的程式,insert 可能会受到影响,写insert 最好加
    insert table(c1,c2) values('1','2')这样做,加栏位就不会影响到原程序。
    2对于有一些栏位可以新增一张table,通过关联表也有助于数据库的结构
      

  6.   

    如果楼主是sql 2005, 那么, 可以在修改方案1:
    设计一个主表, 包含大多数商品都会用到的属性. 为这个主表设置一个扩展属性列, 列的类型使用xml数据类型, 由于xml是非常易于扩展的自描述性语言, 所以扩展属性可以根据你的业务变化随时调整, 而借助于sql 2005 对于xml的强大支持, 解析和查询也很容易.
      

  7.   

    谢谢各位大哥的热心回答 :-)邹建大哥:
        针对您的回答:
        主表的设计按常规设计方法
        从表的设计可以简单地使用:        商品编号   属性名称   属性值查扩展属性的时候做一个行列转换.
    =========================================
    如果按您所设计的这个表的结构, 属性值列的类型应该是 varchar, nvarchar, text 等的类型, 但是如果商品的数据都以字符类型的方式存到数据表中, 例如: 商品价格(Price), 原为数值型, 存到数据表中的时候是字符型. 如果用户要对一定范围的商品价格进行查询 (Price>=100 and Price<=200),  那么如何对数据表进行查找(因为存放到数据表中的时候都是字符型, 而不是数值型)另外, 还有一个问题: 如果存到 从表中的属性值为另外一个表的外键,(假设从表中的一条记录:属性名称为商品的类别或商品所属的国家, 对应的属性值为商品的类别ID 或商品所属的国家的ID), 那么用户在查询的时候如何根据 从表中的商品类别的ID, 到类别表中找出相应的类别名称呢?? 谢谢~~~
      

  8.   

    在主表需要增加字段时而主表又不能动的情况下,可以再建立一个表和你的“主”关联起来,这样你就不用动主表了。很多asp程序里边都带有自定义字段,他们大都是采用的这种方式。因为我水平不行呵呵 只能提个思路。不要骂我哈