4

ユーザーがオブジェクトに独自のフィールドを定義し、これらのフィールドに許可された値をオンザフライで (コンパイルなしで) 定義できる必要がある場合、EAVを使用せずにこれをどのように解決しますか?

例: すべてのオブジェクトは、 123 ステータス番号(1.a または 2.b または 3.c が許可されている)への 1 つ以上の参照を必要とします。

4

2 に答える 2

7

リレーショナル データベースは、定義済みの安定したスキーマの存在に実際に依存しています。代わりに、ドキュメント指向のデータベースを検討する必要があるかもしれません。一般に、ドキュメントごとに、その場で属性を自由に定義できます。

スキーマの検証に関しては、ユーザーがスキーマ自体を変更できる場合は、おそらくアプリケーションで行う必要があります。

于 2009-09-01T00:43:18.573 に答える
1

リレーショナル DB を使用する必要がある場合は、(ぎこちない) 回避策があります。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 に答える