2012-04-03 227 views
2

我的數據庫有一個組織表和一個地址表。在地址表中,我想存儲用戶標識和組織標識,以便稍後查看這些標識,也可以爲組織分配多個地址,或者讓用戶能夠選擇爲其他組織添加的地址。這裏的一個例子是如果2個組織共享相同的財產。我還希望我的組織表存儲默認地址ID。然而,當在FuelPHP中使用ORM模型時,這樣做顯得很尷尬(可能與此無關,這只是讓我注意到了一個可能的設計弱點)。數據庫設計:默認地址

以上是一個選項,我可以想到2個更多的解決方案。一種是具有存儲組織ID和地址ID的默認地址表,地址表仍然可以存儲用戶和組織ID。然後,我可以從組織表中選擇默認的地址表,並從地址表中加入地址ID以檢索地址。

第二個選項是在我的地址表中有一個默認地址字段,類型爲bool。然後,我會在選舉中使用where語句在需要時檢索此地址。

第二個選項是我目前的首選選項,因爲這意味着我不必在我的PHP框架ORM模型中更改我的表格並添加鍵和設置關係,因此我不必做太多工作。但是,如果數據庫變大並且性能成爲問題,那麼這些方法哪一個最好?我還沒有考慮過其他方法嗎?

回答

2

聽起來好像你在組織和地址之間有一個m:m(多對多)的關係。因此,在數據庫中表示這一點的最好方法是引入一個新表來表示這種關係。

我不確定您的意思是默認地址,如給定公司的默認地址,或給定用戶創建公司時的默認地址。在第一種情況下,您可以將其添加爲代表關係的新創建表的屬性。在後一種情況下,您可以在用戶表中放置一個外鍵,表示默認地址。

關於性能,使用整數鍵並做適當的索引...!也就是說,跳過關係表並僅爲同一地址上的不同公司創建相似地址會更快。這將爲您節省一次加入公司+地址查詢。但是,如果您需要查找給定地址上的所有公司,則這會變得更慢,因爲您必須讀出不同的地址並進行比較。

所以這一切都取決於你想如何使用你的數據。我會選擇「正確的」選項(一種新的關係talbe),因爲正確的索引不會慢很多,並且以後會給你更多的可能性。

接下來的問題是,你如何讓新用戶選擇一個令人興奮的地址,而不是創建一個重複的條目。這將是你的界面設計中的一個挑戰,你收集的數據的質量將取決於很多在上面。

+1

謝謝,這兩個好的答案,所以很難選擇一個 - 這是我到底做了什麼,但只有在固執地添加is_default字段添加到地址表中,並從組織表中刪除address_id。然後,沒有辦法將該地址唯一地引用到組織。應該爲自己節省一些麻煩,但這是學習你爲什麼做事或什麼時候以某種方式做的一個好方法!這也有助於教會我究竟是多麼多的關係。謝謝。 – 2012-04-04 07:06:27

+0

沒問題,很高興我能幫到:-) – 2012-10-31 11:33:57

1

個人而言,我會去的以下內容:

Organization 
------------- 
OrgID 
OtherOrgColummns 

Address 
------------- 
AddressID 
OtherAddressColumns 

OrgAddresses 
------------- 
OrgID 
AddressID 
IsDefault 

雖然我不能肯定這會根據您的描述工作。

警告字 - 大約有10,000種方法可以寫出相同的地址。例如:

111 First Street 
111 1st street 
111 1st st. 
111 1st str 
etc. 

我不知道你即將讓人們進入副本怎麼關注,但如果這將是一個問題,我會建議使用地理編碼服務來獲取經緯度長的地址,然後使用lat長,以確定您是否已經在您的數據庫中的地址...只是一個想法...

+0

在這個設計中,你必須確保你沒有爲同一個OrgId設置多個'OrgAddresses'爲默認值 – thundergolfer 2017-10-21 01:55:53