2014-01-12 31 views
3

我正在用Mysql和INNODB引擎创建电子商务的数据库结构。客户多地址和默认地址的Mysql数据库设计

1点:要为客户创造多个地址我有这个表

我在正确的方式做这件事?我应该如何存储默认地址(在哪个表中)?

第2点:我有另一个名为“供应商”的表,我应该只将它连接到“supplier_address”表的地址还是有更好的方法?

点3:表格城市和国家呢?我应该添加一些东西还是可以的?也许在另一个表中的一个字段“区”?

回答

4

在我看来,你让这太复杂了。没有必要让您的地址架构过于标准化。我见过的大多数系统是处理多个客户地址有一个客户表像你,然后有一个地址表,如下所示:

customer_id 
address_ordinal (small number for each customer: 0,1,2,3 etc). 
primary (boolean) 
address_1 
address_2 
locality (city, village, etc) 
province (state, etc) 
postcode (zip, postcode etc) 
country 

customer_id是一个外键customer表。主键是(customer_id,address_ordinal)的组合。如果地址是主要地址,则primary列是true

关于您对供应商的问题,您可能需要创建一个名为“contacts”的公用表,并为您的客户和供应商提供contact_ids。

如果您的系统包含一个包含(邮编,地方,省)行的参考表(可能是您从数据供应商处购买的),您可以使用它来填充地址表。但是您应该避免强制您的地址只包含硬编码的邮编:这些引用表会非常快地过期。

+0

你为什么插入字段address_ordinal?如果这些地址在不同的城市,也许在不同的省份,并且有不同的邮政编码呢? – Manuel

+0

某些地址可能有两条线路(例如1120 Park Avenue/Apartment 102)。这就是为什么有'address_1'和'address_2'列。如果某个特定的customer_id只有一个地址,则序号为0.如果添加另一个地址,则序号为1等。 –

0

我会用我的答案开始我的答案:“有不止一种方法来给猫一个皮肤。”也就是说,我有几点建议:

要点1 - 假设客户可以有多个地址(即账单和邮寄),那么是的,您可以根据单独的映射表获得正确的想法。至于为customer_addresses添加一个名为default或preferred的字段,或者类似的东西,这不是一个坏主意,但另一种选择是添加一个名为address_type的新字段,它将引用一个带有两个记录“Billing”和“Mailing”的单独表“和/或任何你想要的东西。然后,在您要编码的任何应用程序中,将使用地址数据,具体取决于什么上下文,即如果您位于结算信息页面上,则编码您在页面上使用的地址类型,如SELECT * FROM customer_addresses WHERE address_type = 2 /* Billing */

第2点 - 与客户相同。

第3点 - 您是否希望能够显示缩短的国家名称?例如,“美国”缩写为“美国”,“加拿大”缩写为“CAN”,或“英国”缩写为“英国”?我会考虑为此目的添加一个缩写国名的字段。

+0

谢谢!一些问题:在第1点中,如果客户想要更改默认地址,我应该修改该字段,但如果在执行此操作时出现错误,该怎么办?例如,我将有一个没有默认地址的用户?我认为这是不一致的,也许会更好地在客户表中添加此字段? – Manuel

+0

也许考虑一下,你说的第二个选项更好,所以用户可以存储一个addr用于计费,一个用于发货;)我colud还添加了例如类型3,表明客户添加的地址实际上不是'用于计费或发货!你怎么看待这件事? – Manuel