Xtr*_*eme 4 database-design address
当我四处搜索时,推荐的方法是使用同一个表中的发票地址和送货地址,并使用“类型”字段来显示它是什么。例如
Addresses(Company, address, city, type)
Run Code Online (Sandbox Code Playgroud)
Type = 1:地址是收货地址
Type = 2:地址为发票地址
Type = 3:收货地址和发票地址(地址相同)
如果有人不看我使用数据库的代码,他们就不会知道类型 2 是什么。是交货、发票还是两者兼而有之?你通常会澄清这一点吗?如何澄清?例如,如果有人想在数据库(在调用数据库的代码之外)搜索所有账单地址,他们不知道是否应该使用类型 1、2 或 3 从数据库客户端获取所有发票地址。
与如果您有两张桌子相比,那么桌子的名称说明它是什么,任何人都可以轻松挑选出所有发票地址。
Delivery(Company, address, city)
Invoice(Company, address, city)
Run Code Online (Sandbox Code Playgroud)
And*_*yer 26
地址就是一个地址。无需将相同的地址详细信息存储两次,因为它用于交付地址和发票。在您的订单表中,您会有像delivery_address_id
和这样的列invoice_address_id
,它们可以具有相同的值。如果您想列出用作送货地址的所有地址,您可以进行简单的半连接
Select *
from address
where address_id in (select delivery_address_id from orders)
Run Code Online (Sandbox Code Playgroud)
Iva*_*ahl 12
我们在地址方面遇到了类似的问题。最初,地址详细信息存储在不同的表中。这导致了很多问题,地址格式随着时间的推移变得非常不一致,所以我不鼓励将地址存储在多个表中。
一个整齐的解决方案,你可以实现(这是我们正在使用它的工作井)正在创建一个地址表是只存储地址(不带类型)。然后创建一个AddressType 表来存储不同类型的地址。最后,您有一个链接表,其中存储 (a)地址记录的ID,(b)地址类型的ID和 (c)地址所属实体(例如客户端)的ID。
数据库可能看起来像这样:
这将为您提供以下好处:
当地址既是收货地址又是发票地址时,没有重复的地址记录
如果将来需要,可以轻松添加更多地址类型(例如商业、邮政、住宅等)
轻松查询属于一个实体的所有地址,也可以轻松地按地址类型过滤
例如
SELECT cal.ClientId, aty.Type, a.Unit, a.Building, a.Complex, a.Street, a.Suburb, a.City, a.Postcode, a.Country
FROM ClientAddressLink cal
INNER JOIN Address a ON a.AddressId = cal.AddressId
INNER JOIN AddressType aty ON aty.AddressTypeId = cal.AddressTypeId
WHERE cal.ClientId = 1
-- If you want to filter by type
AND aty.Type = 'Delivery';
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1728 次 |
最近记录: |