我读过这。但我不确定我是否正确理解,或者我的情况略有不同。
So,下面是我的情况:我有一个表,其中包含客户的传递地址,并且有两种类型的传递地址--主传递地址(每一列都是必需的)&替代传递地址(可选)。
这是我的delivery_info
桌:
id(PK)
city_id(FK)
area_id(FK)
recipient_name(NULL)
street_address(NULL)
contact_no(NULL)
我的orders
表:
id(PK)
delivery_info_id(FK)
alt_delivery_info_id(FK)
status
...
两个地址的城市(city_id
)和区域(area_id
)总是可用的,并且必须是相同的,这意味着可选的递送地址必须位于同一个城市和主递送地址的相同区域。但是其他3列-- recipient_name
、street_address
、contact_no
是主传递地址所必需的,但对于可选的传递地址则是可选的。
因此,我的问题是,我是否应该将这两种类型的传递地址分离到两个不同的表中,例如delivery_info
和alt_delivery_info
,还是保持原样?
发布于 2020-03-24 21:00:36
没有硬性规定。这是我在做出决定时所使用的逻辑。
一般来说,将一组东西(传递地址)分散在多个列中是很笨拙的。
我会取出整个“传递”列集,并为它们制作一个表。这个新表中将有一两行。
然后,我会做一个这样的方法:
图A:主表中有两栏:
delivery INT UNSIGNED NOT NULL,
alt_delivery INT UNSIGNED NULL, -- note Nullable
计划B:delivery
表将有一个列,其中包含1或2,指示1=preferred。(或对此作出某种变体)。JOIN
中的包含该列。
计划B特别适合电话号码之类的东西,因为可以有任意数量的电话号码(手机、家庭、工作、传真等)。另一方面,对于delivery
,您可能有一个相当强的限制,今天正好有一个或两个地址。
在这两种情况下,对地点或电话进行任何类型的脱钩可能都是不明智的。那么,如果有一个偶然的dup;毕竟,同居是常见的。
在稍微不同的用例中,计费UI可能会问用户“发货地址与计费地址相同吗?”这让用户可以选择将两者结合在一起。在这种情况下,主表有两个非空列bill_to
和send_to
,它们可能链接到同一个address
,也可能不链接到同一个D6
。
在“位置”表中,‘正常化’城市、国家等都是笨拙的。这是不合理的,因为这两个原因都没有正常化:它没有节省太多的空间,而且你很可能不需要在某个中心位置更改城市/国家的拼写。(捷克斯洛伐克)
https://dba.stackexchange.com/questions/261868
复制相似问题