ユーザーが自由にスキーマを決められるクラウドDBをCakePHPで作ろうとしているのですが、RDBMSで表現したいとして、
Entityテーブル:
・id
・name
Attributeテーブル:
・id
・entity_id
・attribute_name
・primary(このattributeをプライマリーキーとして扱うかをboolean型で表現)
Dataテーブル:
・id
・attribute_id
・value
・primary_key(TEXT型でこのプライマリーキーによってデータ取り出す)
例えば
UsersテーブルをこのクラウドDBで作りたい場合、
id、username,passwordというカラムを入れたUsersテーブルを作りたいとすると
Entityテーブルに
・id=1,
・name='Users'
Attributeテーブルに
・id=1,
・entity_id=1,
・attribute_name="id"
・primary=true
・id=2,
・entity_id=1,
・attribute_name="username"
・primary=false
・id=3,
・entity_id=1,
・attribute_name="password"
・primary=false
というようにスキーマを作ります。
そしてusername='user',password='pass'というユーザーデータがあるとすると
・id
・attribute_id
・value
・primary_key(TEXT型でこのプライマリーキーによってデータ取り出す)
・id=1,
・attribute_id=1,
・value=1,
・primary_key=1
・id=2,
・attribute_id=2,
・value='user',
・primary_key=1
・id=3,
・attribute_id=3,
・value='pass',
・primary_key=1
というように、Entityでテーブル名を、Attributeテーブルでそのテーブルのカラムを、Dataテーブルでレコードを表現したいと考え作ってみたのですが、主キーをつかってデータを取り出そうとすると、
1・Attributeテーブルの中でprimaryがtrueになってるidをとりだし、dataテーブルからそのattribute_idで検索し主キーのデータを取り出す。(今回のUsersテーブルならattribute_id=1がprimary=trueなのでdataテーブルからattribute_id=1を検索、)
2・そのprimary_keyでattribute_idが2と3であるDataを検索する
3・取り出したデータを統合しUsersテーブルの1データとする
という流れになり、ユーザーが4カラムがあるテーブルのスキーマと100件のレコードを作ったとすれば400件のクエリがDBに飛ぶ形式になってしまいました。
DataテーブルがEAVアンチパターンであることも認識しているのですが、どのように設計すれば良いのかわかりません。
何かいい設計法はありませんでしょうか。よろしくお願いします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。