我有一个简单customers
表设计成这样(我只报告某些领域,那些对此qeustions):SQL:表设计船舶/发票地址和SELECT CONCAT问题
+ ----------- + --------------- + ---------------- +
+ customer_id + invoice_address + ship_address +
+ ----------- + --------------- + ---------------- +
+ 33 + 234, Walnut Ave + null +
+ ----------- + --------------- + ---------------- +
+ 47 + 66, Smart Ave + null +
+ ----------- + --------------- + ---------------- +
+ 47 + 4, Cool Ave + 45, Dark Street +
+ ----------- + --------------- + ---------------- +
行与空ship_address表示我们还必须使用客户的发票地址来发货。
1号问题:这是一个足够好的设计,还是应该全部null
ship_address
领域充满发票地址(即使是相同的),并没有离开null
。
第二个问题:保持这样的设计(即使在情况下,它是很糟糕的设计),如何创建一个SELECT查询(如果可能的话),对每一行返回总是一个单地址:ship_address
当不null
,否则只是invoice_address
,类似于:
SELECT CONCAT_IF_SHIP_ADDRESS_NOT_NULL_OTHERWISE_USE_ONLY_SHIP_ADDRESS(invoice_address, ship_address) AS address FROM customers;
查询MySQL DB。
谢谢,
那么这些答案就是让SO真正成为一个独特的学习场所。这种设计非常棒,唯一的副作用是对客户的简单SELECT(带地址)将始终需要JOIN。但是对于产品的生产和期待,当数据库可能变得巨大时,这绝对是正确的道路。 – 2010-12-16 17:36:29
实际上客户 - 地址是一个n:m关系导致相同的地址也可能适用于多个客户(即同一公司内的不同员工,我使用与船名地址相同的公司地址),但从我了解CustomerAddressXref桌子也可以处理这个。顺便说一句:我已经拆分了城市,州,..档案,我只是没有在问题中写出来,以保持简单。 – 2010-12-16 17:36:59
如果客户更改地址,会发生什么情况?客户以前的发票地址不应该为了历史目的而更改......那么应该怎么做? – greaterKing 2014-10-05 03:39:17