如果他们在同一个表中,其他人如何知道送货地址和发票地址是什么?

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)


Vil*_*lx- 5

另一种选择:代替1,23使用字符串'invoice''delivery'enum为此,MySQL 甚至有一个列类型。对开发人员更加友好,并且没有显着的开销。