用户定义字段的EAV替代方案?

时间:2009-09-01 00:36:43

标签: database-design entity-attribute-value

鉴于用户必须能够在对象上定义自己的字段,并为这些字段定义允许的值 - 即时(无编译) - 如何在不使用EAV的情况下解决此问题?

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

2 个答案:

答案 0 :(得分:7)

关系数据库确实依赖于预定义和稳定模式的存在。 也许你应该看一下document-oriented databases。它们通常允许按文档和动态自由定义属性。

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

答案 1 :(得分:2)

如果必须使用关系数据库,则会出现(笨拙)解决方法。我也推荐EAV(如果可以的话)或Thilo的建议。这是实现它的关系方式。

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

  1. 我们假设最大限度 用户可以使用的列数 为每种数据类型创建。
  2. 如果许多用户只使用少数几列
  3. ,我们将拥有稀疏表
  4. 我们需要为每列添加意义的用户的概念
  5. 严重违反普通表格
  6. _

    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)映射到用户提供的用户可读名称。