我知道这是一个古老的话题,但我想它永远不会失去现实。我现在正在开发类似的东西。这是我的方法。我使用 MySQL、Apache、PHP 和 Zend Framework 2 作为应用程序框架的服务器设置,但它应该与任何其他设置一样工作。
这是一个简单的实现指南,您可以从这里进一步发展它。
您需要实现自己的查询语言解释器,因为有效的 SQL 太复杂了。
例子:
select id, password from user where email_address = "xyz@xyz.com"
物理数据库布局:
表“规格”:(应缓存在您的数据访问层中)
- 编号:整数
- parent_id:整数
- 名称:varchar(255)
表“项目”:
- 编号:整数
- parent_id:整数
- spec_id:整数
- 数据:varchar(20000)
表“规格”的内容:
- 1, 0, '用户'
- 2, 1, 'email_address'
- 3, 1, '密码'
表“项目”的内容:
- 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"
)
)
我希望您能理解并自己确定该方法对您是否可行。
享受!:-)