现在一个物流的项目有一个要求,如下:
在采购订单中,除了系统给定的一些字段之外,允许用户自定义字段。我们会在数据库中预留一些各种类型的字段,比如:col1 : int
col2 : int
.
.
col50 : string
col51 : string
.
.
col70 : date
col71 : date用户可重命名这些字段,即系统中不显示col。假设用户设定col2为“付款方式”,col51为“订单备注”,那么,存储“付款方式”,“订单备注”数据的表应该如何设计呢?注:系统中采用了hibernate,不知道这样的数据库如何设计,请各位高手帮忙了!越详细给分越高!

解决方案 »

  1.   

    alter table tablename 
    rename column col2  to 付款方式;alter table tablename 
    rename column col51  to 订单备注;
      

  2.   

    写动态存储过程实现:
    给定参数
    create or replace procedure xx( v_1 varchar2,v_2 varchar2)
    is 
    sqlstr varchar2(200);
    begin
    sqlstr:='alter table tablename rename column '||v_1||' to '||v_2||';';
    execute immediate sqlstr;
    end;当用户要修改那个列的时候只要调用这个存储过程就可以。
      

  3.   

    每次都改表结构好像也不是解决问题的办法,建议可以借鉴一下oracle数据库字典中v$session的方法(多定义几个预留的成对的字段,一个写字段名称,一个写字段的值):
    P1TEXT                                                         VARCHAR2(64)
    P1                                                             NUMBER
    P1RAW                                                          RAW(8)
    P2TEXT                                                         VARCHAR2(64)
    P2                                                             NUMBER
    P2RAW                                                          RAW(8)
    P3TEXT                                                         VARCHAR2(64)
    P3                                                             NUMBER
    P3RAW                                                          RAW(8)

      

  4.   


    --提供个思路:(假如此表的名称为:user_define_table)Create or replace trigger biu_user_define
      Before  update or insert On user_define_table
      for each row
    begin--使用循环进行判断:if updating then
       if ... then ...  --使用:new.col=:old.col对每列进行判断,看用户修改了有没有?
       --如果已修改,则记录表名为user_table_i,col名为v_col_i,修改值为u_col_i:select 'alter table user_table_i rename column ' || v_col_i || ' to ' || u_col_i from user_define_table;
    end if;
    if inserting then
    --如果是新增表,则用insert into来做。
    end if;
    end biu_user_define;
      

  5.   

    我會采用 3 樓的寫法
    因為這樣,你可以依記錄不同,取得不同的標題
    我在設定工資表的時候,因為不同人的項目不同,就用二個字段來處理的。或都你可以用二個表來實現,A,B
    A 視情況是否存儲字段名稱,長度
    B 字段名稱可能會是col1..col100數據長度盡量放大 
      

  6.   

    这种项目如果用ddl来更改字段名,应该不是好的方法我见过的方法是自已定义数据字典,不过我不会,:)
      

  7.   

    我觉得,你在数据库中预留一些各种类型的字段,这不是好办法.因为数据库中的table是所有用户共用的,亦即是你这些预留的字段可能会被多个不同的用户修改,这样会出问题.自定义字段,其实对于用户来说,不应该让他去真正修改表结构,应该把它的动作看作一组数据
    所以要设计一个专门的表来存放,表中设计关联字段.可以尝试这样设计:create table 用户字段表
    (
    用户ID                   int,        -- 用于关联对应的用户
    自定义字段所在的表名 varchar2(50),     -- 用于关联被定义的表
    定义字段name         varchar2(50),
    定义字段value     varchar2(100)
    )
     
      

  8.   

    to sleepzzzzz 
    你的設計是把每個用戶的自定議字段內容有記錄下來,但是後續輸入數據如何來對應,是否會出現每個用戶一個表,在存取數據的時候會比較麻煩 樓主的用戶自定議是否會經常變動也是要考慮的問題