【高分请教】关于一个挠头的数据库设计问题

dy_paradise 2008-11-06 09:09:10
现在一个物流的项目有一个要求,如下:
在采购订单中,除了系统给定的一些字段之外,允许用户自定义字段。我们会在数据库中预留一些各种类型的字段,比如:

col1 : int
col2 : int
.
.
col50 : string
col51 : string
.
.
col70 : date
col71 : date

用户可重命名这些字段,即系统中不显示col。假设用户设定col2为“付款方式”,col51为“订单备注”,那么,存储“付款方式”

,“订单备注”数据的表应该如何设计呢?

注:系统中采用了hibernate,不知道这样的数据库如何设计,请各位高手帮忙了!越详细给分越高!
...全文
194 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
chentony 2008-11-08
  • 打赏
  • 举报
回复
to sleepzzzzz
你的設計是把每個用戶的自定議字段內容有記錄下來,但是後續輸入數據如何來對應,是否會出現每個用戶一個表,在存取數據的時候會比較麻煩 

樓主的用戶自定議是否會經常變動也是要考慮的問題 
sleepzzzzz 2008-11-07
  • 打赏
  • 举报
回复

不知道lz是否能理解我的意思?也不知道我的理解是否符合你的需求?
sleepzzzzz 2008-11-07
  • 打赏
  • 举报
回复
我觉得,你在数据库中预留一些各种类型的字段,这不是好办法.

因为数据库中的table是所有用户共用的,亦即是你这些预留的字段可能会被多个不同的用户修改,这样会出问题.

自定义字段,其实对于用户来说,不应该让他去真正修改表结构,应该把它的动作看作一组数据
所以要设计一个专门的表来存放,表中设计关联字段.

可以尝试这样设计:

create table 用户字段表
(
用户ID int, -- 用于关联对应的用户
自定义字段所在的表名 varchar2(50), -- 用于关联被定义的表
定义字段name varchar2(50),
定义字段value   varchar2(100)
)


codearts 2008-11-07
  • 打赏
  • 举报
回复
这种项目如果用ddl来更改字段名,应该不是好的方法

我见过的方法是自已定义数据字典,不过我不会,:)
wfqqwer5213 2008-11-07
  • 打赏
  • 举报
回复
我们项目对字段太多的表也是这样处理的!
chentony 2008-11-07
  • 打赏
  • 举报
回复
我會采用 3 樓的寫法
因為這樣,你可以依記錄不同,取得不同的標題
我在設定工資表的時候,因為不同人的項目不同,就用二個字段來處理的。

或都你可以用二個表來實現,A,B
A 視情況是否存儲字段名稱,長度
B 字段名稱可能會是col1..col100數據長度盡量放大 
BlueskyWide 2008-11-07
  • 打赏
  • 举报
回复

--提供个思路:(假如此表的名称为: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;



[Quote=引用楼主 dy_paradise 的帖子:]
现在一个物流的项目有一个要求,如下:
在采购订单中,除了系统给定的一些字段之外,允许用户自定义字段。我们会在数据库中预留一些各种类型的字段,比如:

col1 : int
col2 : int
.
.
col50 : string
col51 : string
.
.
col70 : date
col71 : date

用户可重命名这些字段,即系统中不显示col。假设用户设定col2为“付款方式”,col51为“订单备注”,那么,存储“付款方式”

,“订单备注”数据…
[/Quote]
gikskse123 2008-11-07
  • 打赏
  • 举报
回复
学习了
wffffc 2008-11-07
  • 打赏
  • 举报
回复
每次都改表结构好像也不是解决问题的办法,建议可以借鉴一下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)

范佩西_11 2008-11-06
  • 打赏
  • 举报
回复
写动态存储过程实现:
给定参数
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;
当用户要修改那个列的时候只要调用这个存储过程就可以。
ab5669 2008-11-06
  • 打赏
  • 举报
回复
alter table tablename
rename column col2 to 付款方式;

alter table tablename
rename column col51 to 订单备注;

17,088

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧