如何在数据库表中指定客户默认送货地址?

Bil*_*l H 5 mysql database

这是一个简单的例子:

假设我有一个与地址表具有一对多关系的客户表(客户可以有多个送货地址,但送货地址只能属于一个客户).

Customer Table
-------------
customer_id (PK)


Address Table
-------------
address_id (PK)
customer_id (FK)
Run Code Online (Sandbox Code Playgroud)

现在我希望每个客户都能够指定默认的送货地址.

我可以想到两种方法,但都有缺点.

选项1

将一个布尔列添加到名为"is_default"的地址表中.

优点

  1. 选择查询很简单
  2. 如果他们看到数据库模型,那么其他人可以直接理解

缺点

  1. 应用程序被强制执行并维护"只有一行可以是默认值"约束.
  2. 更新默认字段很痛苦,因为它要求应用程序检查并重置以前的默认选项.

选项2

在Customer表中添加一个名为"address_id"的列,并将其设为外键(如果不存在地址,也允许空值).

优点

  1. 如果用户决定更改默认地址,则可以轻松更新.
  2. 数据库维护"只有一行可以是默认值"约束.

缺点

  1. 每次我决定添加某种默认元数据时,我都必须向Customers表添加一个新的索引列.

  2. 看起来像一个黑客

我的问题是,有没有一种标准的方法来处理我忽略的这种情况?当然还有其他选项(可能会创建一个EAV默认选项表?)但我更喜欢保持它尽可能简单,因为对现有代码库进行了更改,所以我不想破坏任何东西.

Mac*_*Mac 1

(也许创建一个 EAV 默认选项表?)

我会这样做,特别是如果您担心破坏现有代码。

Customer_Defaults
------------------------------------
customer_id                          PK, FK -> Customer
default_shipping_address_id          FK -> Address
Run Code Online (Sandbox Code Playgroud)

不是很整齐吗?通过将整个内容放入一个单独的表中,您可以保留现有的表。如果您使用某种 ORM 层,则可以直接查询这个新表上的对象,然后您可以走到 Address 对象。甚至不需要将新对象引入现有的客户或地址对象。