我需要在同一個表上的兩種不同類型的連接(可以說ADDRESS
和USER
)。我可以使2個表(BILLING_ADDRESS
和SHIPPING_ADDRESS
)在都具有3列(ID
,USER_ID
,ADDRESS_ID
),或我可以使一個單一的表(CUSTOMER_ADDRESS
)與一種類型的柱(ID
,USER_ID
,ADDRESS_ID
,ADDRESS_TYPE
)。我應該有2個相同的表
對於DRY編碼實踐我只想着單個表,但這意味着當我編譯2個列表時,我將不得不執行全表掃描兩次。
select address.* from customer_addresses, address where user_id = 1 and address_type = 'Billing'
和
select address.* from customer_addresses, address where user_id = 1 and address_type = 'Shipping'
都依賴於customer_addresses表的全表掃描。
如果我們有1000個客戶地址,這意味着已掃描2000條記錄以查找該客戶的所有地址。
如果我做了2個不同的表,則僅1000客戶地址進行掃描,因爲shipping_addresses表僅持有800地址/客戶記錄,以及billing_addresses表持有其他200
所以對於性能我想不得不說2個不同的表格。對於DRY,我將不得不使用單桌。對此有什麼行業的想法?
你在辯論2n和1n之間的時間複雜性。在這種情況下,這並不重要。 – 2015-02-07 16:04:39
它不應該要求全表掃描。 'user_id'上的一個索引會將其過濾爲只有2行,然後只需掃描這兩行就可以找到具有正確'address_type'的行。 – Barmar 2015-02-07 16:04:46