2009-10-19 24 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