簡體   English   中英

(My)SQL數據庫的層次結構

[英]Hierarchical structure with (My)SQL database

我想創建一個網站,其中的商品僅在特定區域/地區可用。 這些項目可用的區域/位置通過以下模式選擇:

  1. 要么選擇州,要么該項目在全國范圍內可用。
  2. 對於每個選定的州,可能都會選擇縣,否則它會在整個州范圍內可用。
  3. 對於每個縣,可能都會選擇城市,否則將在整個縣范圍內提供。

依此類推...您可能知道了。

現在我的問題是如何使用MySql DB實現這樣的結構? 還是有一個具有合適GUI的更好的數據庫模型? (那將是完美的)項目數量很少(〜20)。

當客戶訪問該頁面時,他將輸入其位置,並將列出該位置可用的所有項目。 用於此目的的查詢看起來如何?

非常感謝,Flo

您可以使用以下列創建表locations

id | type | name        | parent_id
 1 |    1 | State 1     |         0
 2 |    1 | State 2     |         0
 3 |    2 | County 1    |         1
 etc

在此示例中,縣1屬於州1,並且假定“ id 0”為“全國性”。

使用該模型,創建用於設置項目可用性的GUI非常簡單:首先通過parent_id = 0查詢並將其作為列表提供,並在nationwide作為默認選項; 如果選擇了狀態,則將生成另一個列表,使用選定的id作為parent_id並提供全state wide默認選項等。在用戶單擊“保存”后,獲取最深級別的id並將其保存為location_id

但是,當涉及到實際獲取項目列表時,它變得不那么簡單了。 例如,如果您的用戶說他的位置是County 1 ,那么您應該返回具有location_id = 3、1或0的項的組合結果,並沿parent_id向上移動樹。 如果使用支持遞歸查詢的RDBMS,則可以在單個查詢中獲得這些查詢。 MySQL不支持該功能,因此您必須解決此問題,方法是創建一個循環以查詢具有特定位置ID的items ,然后從位置中選擇parent_id ,然后重復該查詢。

不利的一面是您不能通過該結構控制樹的完整性。 也就是說,盡管您可以創建插入/更新觸發器來對此進行幫助,但您無法控制一個城市只能將一個縣作為父母。 也可以創建一個循環(通過將項相互育種),並可能導致問題。

在這里,您可以找到有關此問題的不同方法的相當詳細的說明。 基本上,您的選擇是a)構造ParentID / ChildID樹,或b)嵌套集。 因為,盡管其他rdbms系統支持遞歸,但MySQL卻不支持(至少不使用復雜的存儲過程),尤其是因為您的數據似乎是靜態的,即不會發生太大變化。 我建議您采用嵌套設置的方式。 這會使您的事情變得容易得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM