2009-08-04 30 views
0

我需要能够根据不同的标准和位置将潜在的业主与被遗弃的动物进行匹配。如何模拟不同的标准?

店主将有一个特定的标准集。动物类型=“狗”,品种=“拉布拉多寻回犬”,年龄将需要在1至5之间,性别=男性,等等......

动物也将有一个特定的标准集。动物类型=“狗”,年龄= 3,性别=男性,品种=“奇瓦瓦”。

动物也可能是:TYPE = “猫”,年龄= “12”,性别=女性,品种= “老虎”。

我也有业主和包含与任何动物或所有者的位置信息的动物(多态)既是一个“位置”的模式。

所以这部分很简单...

难的部分(至少对我来说)是当我需要指定不同的动物种类不同的标准。因此,类型=“狗”的动物可能会有“可以获取?”的标准。而猫类动物可能有“去爪子?”的标准。和“鱼”类动物可能具有“模式”的标准,并具有[“斑点”,“条纹”,“平原”]的多个选项。我现在所拥有的是一个具有通用动物信息(年龄,性别,品种)的“动物”模型,然后我有一个品种模型​​与每种动物类型的不同品种,但我不知道如何抽象出动物类型不同的标准。

同样,这只是一个比喻,因为我不认为我的实际问题将毫无意义给其他人。我需要的仅仅是一些指向正确方向的指针,可能是一两个链接。我似乎无法解决如何在Rails中做到这一点,而无需为每个条件集创建单独的表,如dog_criteria,cat_criteria,fish_criteria等...

回答

0

在软件模特界,这显然与一个做每个物种的IE,IE “动物”延伸的“狗”,“猫”,“鱼”。在关系数据库世界中,这变得有点难以表示。

如果你想匹配数据库中的这个面向对象的方法,你将有一个表,“动物”,然后对每个品种的表,“猫”,“狗”和“鱼”。那么你可能会有一个物种表(或者代码中的硬编码枚举),这会给你一个值放置在每个动物所属物种的动物行中。这会告诉你如何查找每个动物的进一步信息。

这可能不是最好的方法。你拥有的是更多我称之为每个动物的“自定义数据”。您应该定义一个具有自定义属性列表的表格,以及另一个将这些属性与每个动物行的值相匹配的表格。

如果你想使之更方便看到和哪些属性可以应用到你可以做一个第三个表“类别”,这将链接到的动物种类和属性的集合哪些物种控制。然后,您将在动物行上指定类别ID。

示例表:

Animals 
------- 
ID 
Age 
Sex 
Species 
Breed 

Parameters 
---------- 
ID 
Name 

Parameter Values 
---------------- 
ParameterID 
AnimalID 
Value 

Categories (optional - add CategoryID to animals) 
--------------------- 
ID 
Name 

Category Parameters 
------------------- 
CategoryID 
ParameterID 
1

有时我们会诉诸简单名称/值对(或名称/值/类型三元组)。这节省了为世界上每个动物物种添加新类型(和数据库表)。或者每个品种糟糕的是:考虑贵宾犬......他们可能有一个额外的字段“剃光装饰品” ......和圣Bernards旅馆,白兰地能力......

+0

我绝对考虑过这条路线,但它只是没有“感觉”正确(因为没有更好的词)。我不会基本上失去修改特定参数的可用属性的能力吗?我将无法找到所有“装饰性”修饰的Poodle吗? – Shane 2009-08-04 21:26:25

+0

我们正在进行强大的打字(编译时检查)以抵御浮动(任意属性)。您可以为属性设置某种“模式”,因此在运行时您可以确定可以剃毛狮子狗。这是更多的代码,而编译器并不能帮助您检查是否只尝试刮脸,但它会简化持久性。 – djna 2009-08-05 05:23:13

0

名称值对溶液可以在数据库内进行。

在这个例子中有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');