質問: ユーザーが自由にスキーマを決められるクラウド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アンチパターンであることも認識しているのですが、どのように設計すれば良いのかわかりません。 何かいい設計法はありませんでしょうか。よろしくお願いします。
回答: > > どのように設計すれば > > > →システムのインプットとアウトプットは明確になっていますか? 明確になっていなければ、まずはそこから着手しながら、 頭の中でテーブル設計を出来ると良いです。 > > ユーザーが4カラムがあるテーブルのスキーマと100件のレコードを作ったとすれば400件のクエリがDBに飛ぶ形式になってしまいました。 > > > →システムの要件を満たせるのであれば、この程度の件数は問題ないです。 あとはユーザ数が少なければ、ユーザ単位にデータベースを作成して、 テーブルもユーザが指定した通り作成し、、、 と、phpMyAdminのような画面が出来上がるのかな、とも思いましたが。 ちなみに、postgresqlのjsonb型に似たものが、MySQL5.7以降であれば、json型というのがあります。