我需要在同一个表上的两种不同类型的连接(可以说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