2009-10-19 62 views
0

所以我正在开发一个CMS,它将允许用户通过数据库表“遍历”。我在实施时遇到了一些麻烦,并且想知道是否有人有任何建议。MySQL dot-traversal ...可能吗?

Table: house 
name (varchar), town (relationship, using the rel table) 

Table: town 
name(varchar), state (relationship, using the rel table) 

Table: state 
name(varchar) 

Table: rel 
id1, id2, rel_type 

以下示例显示了其预期用法。它写道:“查找阿拉斯加州内的10个房屋,按名称排序”。

<?php 
$Record = new Pod('house'); 
$Record->findRecords('name ASC', 10, "town.state.name = 'Alaska'"); 
?> 

作为一个方面说明,我可以很容易地一个小镇的名字中找到的房子,因为MySQL支持[表] [点] [列名]:

<?php 
$Record = new Pod('house'); 
$Record->findRecords('name ASC', 10, "town.name = 'Great Falls'"); 
?> 

我总是把“状态”字段直接放入“house”表中,但用户需要能够引用其他列中的列。提前致谢!

回答

4

您需要使用join,例如:

SELECT 
    house.* 
FROM 
    house 
    JOIN town ON town.id = house.town 
    JOIN state ON state.id = town.state 
WHERE state.name = 'Alaska' 

查询将与1工作:N的关系,但由于使用的是M:N的关系(以一种不可思议的方式来实现),你会需要加入更多的表格。

这使得对象模型稍微复杂一点,您将不得不考虑用于这些查询的新API。或者使用(看看它是如何完成的)现有的ORM系统。

为了解释1:N与M:N问题 - 在设计良好的数据库中将ID指向其他表而没有外键约束的ID不常见。 M中的常用方法型号:n的关系是:

  • 房子:ID INT(PK),名称为varchar
  • house_town:房子INT(PK,FK引用house.id),镇INT(PK, FK引用town.id)
  • 镇:ID INT(PK),名称为varchar

而对于1:N的关系:

  • 房子:ID INT(PK),名称VARCHAR,镇int(FK参考ences town.id)
  • town:id int(PK),name varchar