Я знаю, что это старая тема, но я думаю, что она никогда не теряет актуальности.
Я сейчас разрабатываю что-то подобное.
Вот мой подход.
Я использую настройки сервера с MySQL, Apache, PHP и Zend Framework 2 в качестве среды приложения, но она должна работать также с любыми другими настройками.
Вот простое руководство по реализации, вы можете развить его дальше от него.
Вам потребуется реализовать собственный интерпретатор языка запросов, поскольку эффективный SQL будет слишком сложным.
Пример:
select id, password from user where email_address = "xyz@xyz.com"
Физическая структура базы данных:
Таблица 'specs': (должна кэшироваться на вашем уровне доступа к данным)
- id: int
- parent_id: int
- имя: варчар (255)
Таблица 'items':
- id: int
- parent_id: int
- spec_id: int
- данные: varchar (20000)
Содержимое таблицы specs:
- 1, 0, «пользователь»
- 2, 1, 'email_адрес'
- 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 из имен спецификаций. В противном случае вам потребуется вставить дополнительные накладные расходы SQL, чтобы получить spec_id из имен, как в следующем фрагменте:
Плохой пример, не используйте это, избегайте этого, вместо этого кешируйте таблицу спецификаций!
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"
)
)
Я надеюсь, что вы поняли идею и можете сами определить, возможен ли для вас такой подход.
Наслаждайтесь! : -)