古い話題であることは承知していますが、決して現実性を失うことはないと思います。そんなものを今開発中です。これが私のアプローチです。MySQL、Apache、PHP、および Zend Framework 2 をアプリケーション フレームワークとして使用するサーバー設定を使用していますが、他の設定でも同様に機能するはずです。
これは簡単な実装ガイドです。これからさらに自分で進化させることができます。
効果的な SQL は複雑すぎるため、独自のクエリ言語インタープリターを実装する必要があります。
例:
select id, password from user where email_address = "xyz@xyz.com"
物理データベースのレイアウト:
Table 'specs': (データ アクセス レイヤーにキャッシュする必要があります)
- id: 整数
- 親 ID: 整数
- 名前: varchar(255)
テーブル「アイテム」:
- id: 整数
- 親 ID: 整数
- spec_id: 整数
- データ: varchar(20000)
表「仕様」の内容:
- 1、0、「ユーザー」
- 2、1、「メールアドレス」
- 3、1、「パスワード」
テーブル「items」の内容:
- 1、0、1、''
- 2、1、2、「xyz@xyz.com」
- 3、1、3、「私のパスワード」
独自のクエリ言語での例の翻訳:
select id, password from user where email_address = "xyz@xyz.com"
標準 SQL に変換すると、次のようになります。
select
parent_id, -- user id
data -- password
from
items
where
spec_id = 3 -- make sure this is a 'password' item
and
parent_id in
( -- get the 'user' item to which this 'password' item belongs
select
id
from
items
where
spec_id = 1 -- make sure this is a 'user' item
and
id in
( -- fetch all item id's with the desired 'email_address' child item
select
parent_id -- id of the parent item of the 'email_address' item
from
items
where
spec_id = 2 -- make sure this is a 'email_address' item
and
data = "xyz@xyz.com" -- with the desired data value
)
)
仕様名から spec_id を取得するには、仕様テーブルを連想配列またはハッシュ テーブルなどにキャッシュする必要があります。それ以外の場合は、次のスニペットのように、名前から spec_id を取得するために、さらに SQL オーバーヘッドを挿入する必要があります。
悪い例です。これを使用しないでください。これを避け、代わりに specs テーブルをキャッシュしてください!
select
parent_id,
data
from
items
where
spec_id = (select id from specs where name = "password")
and
parent_id in (
select
id
from
items
where
spec_id = (select id from specs where name = "user")
and
id in (
select
parent_id
from
items
where
spec_id = (select id from specs where name = "email_address")
and
data = "xyz@xyz.com"
)
)
アイデアが得られ、そのアプローチが実現可能かどうかをご自身で判断していただければ幸いです。
楽しみ!:-)