4

鉴于用户必须能够在对象上定义自己的字段,并为这些字段定义允许的值 - 动态(无编译) - 如果不使用EAV ,您将如何解决这个问题?

示例:所有对象都需要一个或多个对123 statusnumber的引用(允许 1.a 或 2.b 或 3.c)。

4

2 回答 2

7

关系数据库确实依赖于预定义和稳定模式的存在。也许您应该改用面向文档的数据库。它们通常允许对每个文档和动态的属性进行自由定义。

至于模式验证,如果用户可以更改模式本身,则可能需要在您的应用程序中完成。

于 2009-09-01T00:43:18.573 回答
1

如果您必须使用关系数据库,那么有一个(笨拙的)解决方法。我也会推荐 EAV(如果可以的话)或 Thilo 的建议。这是这样做的关系方式。

预先警告。以下是这种方法的局限性:

  1. 我们假设用户可以为每种数据类型创建的列数有一个最大界限。
  2. 如果许多用户只使用少数列,我们将拥有稀疏表
  3. 我们需要为每一列添加意义的用户的概念
  4. 这是对正常形式的严重违反

_

create table main_tbl(

numColumn1 number(10),

numColumn2 number(10),

numColumn3 number(10),

numColumn4 number(10),

numColumn5 number(10),

charColumn1 varchar2(100),

charColumn2 varchar2(100),

charColumn3 varchar2(100),

charColumn4 varchar2(100),

charColumn5 varchar2(100),

dateColumn1 date,

dateColumn2 date,

dateColumn3 date,

dateColumn4 date,

dateColumn5 date

)


create table main_tblmeaning(

user_id varchar(25) foreign key references users_tbl (user_id),

numColumn1_name varchar2(50),

numColumn2_name varchar2(50),

numColumn3_name varchar2(50),

numColumn4_name varchar2(50),

numColumn5_name varchar2(50),

numColumn6_name varchar2(50),

charColumn1_name varchar2(50),

charColumn2_name varchar2(50),

charColumn3_name varchar2(50),

charColumn4_name varchar2(50),

charColumn5_name varchar2(50),

dateColumn1_name varchar2(50),

dateColumn2_name varchar2(50),

dateColumn3_name varchar2(50),

dateColumn4_name varchar2(50),

dateColumn5_name varchar2(50)


)

create table users_tbl(

user_id varchar2(25) primary key,

user_name varchar2(50)

)

每次用户想要一个数字列时,您在 main_tbl 中为他分配一个空闲数字列 (numColumn1 - 5)。在 main_tbl_meanings 中添加一个条目(行),将列(numcolumn1-5)映射到用户提供的用户可读名称。

于 2009-09-01T09:45:46.210 回答