我正在用Mysql和INNODB引擎创建电子商务的数据库结构。客户多地址和默认地址的Mysql数据库设计
1点:要为客户创造多个地址我有这个表
我在正确的方式做这件事?我应该如何存储默认地址(在哪个表中)?
第2点:我有另一个名为“供应商”的表,我应该只将它连接到“supplier_address”表的地址还是有更好的方法?
点3:表格城市和国家呢?我应该添加一些东西还是可以的?也许在另一个表中的一个字段“区”?
我正在用Mysql和INNODB引擎创建电子商务的数据库结构。客户多地址和默认地址的Mysql数据库设计
1点:要为客户创造多个地址我有这个表
我在正确的方式做这件事?我应该如何存储默认地址(在哪个表中)?
第2点:我有另一个名为“供应商”的表,我应该只将它连接到“supplier_address”表的地址还是有更好的方法?
点3:表格城市和国家呢?我应该添加一些东西还是可以的?也许在另一个表中的一个字段“区”?
在我看来,你让这太复杂了。没有必要让您的地址架构过于标准化。我见过的大多数系统是处理多个客户地址有一个客户表像你,然后有一个地址表,如下所示:
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。
如果您的系统包含一个包含(邮编,地方,省)行的参考表(可能是您从数据供应商处购买的),您可以使用它来填充地址表。但是您应该避免强制您的地址只包含硬编码的邮编:这些引用表会非常快地过期。
我会用我的答案开始我的答案:“有不止一种方法来给猫一个皮肤。”也就是说,我有几点建议:
要点1 - 假设客户可以有多个地址(即账单和邮寄),那么是的,您可以根据单独的映射表获得正确的想法。至于为customer_addresses添加一个名为default或preferred的字段,或者类似的东西,这不是一个坏主意,但另一种选择是添加一个名为address_type的新字段,它将引用一个带有两个记录“Billing”和“Mailing”的单独表“和/或任何你想要的东西。然后,在您要编码的任何应用程序中,将使用地址数据,具体取决于什么上下文,即如果您位于结算信息页面上,则编码您在页面上使用的地址类型,如SELECT * FROM customer_addresses WHERE address_type = 2 /* Billing */
。
第2点 - 与客户相同。
第3点 - 您是否希望能够显示缩短的国家名称?例如,“美国”缩写为“美国”,“加拿大”缩写为“CAN”,或“英国”缩写为“英国”?我会考虑为此目的添加一个缩写国名的字段。
你为什么插入字段address_ordinal?如果这些地址在不同的城市,也许在不同的省份,并且有不同的邮政编码呢? – Manuel
某些地址可能有两条线路(例如1120 Park Avenue/Apartment 102)。这就是为什么有'address_1'和'address_2'列。如果某个特定的customer_id只有一个地址,则序号为0.如果添加另一个地址,则序号为1等。 –