名称值对溶液可以在数据库内进行。
在这个例子中有4个表,人,要求,宠物,petstat
Person和宠物各自具有一个ID和一个名称。
每个人也有一个或多个要求。需求有名称,比较和价值。
select * from pet, petstat
where pet.id = petstat.petId
and petstat.name = 'hair'
and petstat.value = 'short'
and petId in (select petId from petstat
where name='type' and value = 'dog')
下面的查询将匹配的人:
每个宠物都有一个或多个PetStats这只是一个名字,并在此设置一个值
的,短头发的狗可以用类似的查询可以找到当宠物满足所有人的要求时,给宠物。
select person.name, pet.name from person, pet
where (select count(*) from requirement where requirement.personid = person.id)
= (select count(*) from requirement, petstat
where requirement.comparison = 'eq'
and requirement.name = petstat.name
and requirement.value = petstat.value
and requirement.personId = person.id
and petstat.petid = pet.id)
+ (select count(*) from requirement, petstat
where requirement.comparison = 'lt'
and requirement.name = petstat.name
and requirement.value > petstat.value
and requirement.personId = person.id
and petstat.petid = pet.id)
+ (select count(*) from requirement, petstat
where requirement.comparison = 'gt'
and requirement.name = petstat.name
and requirement.value < petstat.value
and requirement.personId = person.id
and petstat.petid = pet.id);
的小于和大于比较可以办理加入数字字段的要求,petstat表和增加更多的碎片,以查询更好,但是这给出了一个很好的统计。
这里是插入来创建测试数据。
delete from person;
insert into person (id, name) values (1, 'Joe');
insert into person (id, name) values (2, 'Bill');
insert into person (id, name) values (3, 'Erik');
insert into person (id, name) values (4, 'Mike');
delete from pet;
insert into pet (id, name) values (1, 'spot');
insert into pet (id, name) values (2, 'mittens');
insert into pet (id, name) values (3, 'rover');
delete from requirement;
insert into requirement (personid, name, comparison, value) values (1, 'type', 'eq', 'dog');
insert into requirement (personid, name, comparison, value) values (1, 'color', 'eq', 'black');
insert into requirement (personid, name, comparison, value) values (2, 'type', 'eq', 'fish');
insert into requirement (personid, name, comparison, value) values (3, 'type', 'eq', 'dog');
insert into requirement (personid, name, comparison, value) values (3, 'hair', 'eq', 'long');
insert into requirement (personid, name, comparison, value) values (4, 'type', 'eq', 'dog');
insert into requirement (personid, name, comparison, value) values (4, 'weight', 'lt', '30');
insert into requirement (personid, name, comparison, value) values (4, 'weight', 'gt', '20');
delete from petstat;
insert into petstat (petId, name, value) values (1, 'type', 'dog');
insert into petstat (petId, name, value) values (1, 'color', 'black');
insert into petstat (petId, name, value) values (1, 'hair', 'short');
insert into petstat (petId, name, value) values (2, 'type', 'cat');
insert into petstat (petId, name, value) values (3, 'type', 'dog');
insert into petstat (petId, name, value) values (3, 'weight', '25');
insert into petstat (petId, name, value) values (3, 'color', 'brown');
我绝对考虑过这条路线,但它只是没有“感觉”正确(因为没有更好的词)。我不会基本上失去修改特定参数的可用属性的能力吗?我将无法找到所有“装饰性”修饰的Poodle吗? – Shane 2009-08-04 21:26:25
我们正在进行强大的打字(编译时检查)以抵御浮动(任意属性)。您可以为属性设置某种“模式”,因此在运行时您可以确定可以剃毛狮子狗。这是更多的代码,而编译器并不能帮助您检查是否只尝试刮脸,但它会简化持久性。 – djna 2009-08-05 05:23:13