强制数据库中的字段唯一性是一个糟糕的设计

时间:2013-06-01 01:01:49

标签: database database-design

我有以下表格。

  1. Available_Ip_Address (IP_Address_ID(主键),说明,状态)。

  2. Virtual_Machine (VM_ID(主键),说明,IP_Address(外键))

  3. 方案如下: -

    1. 我们维护单个表的所有可用IP地址。

    2. 我们在另一个表中维护虚拟机信息,但可以随时将特定的IP地址分配给单个VM。

    3. 所以我在添加包含状态为“可用”的所有IP地址的VM时添加了一个下拉列表。
    4. 但由于两个用户可以创建VM,他们可能会选择相同的可用IP地址
    5. 所以我发现保护我们系统的最好方法是使Virtual_Machine表中的外键IP_Address唯一。
    6. 然后,如果两个用户选择相同的IP地址,则会在数据库中为其中一个引发异常,我可以传播异常,然后向用户显示用户友好消息,表明IP地址可能已被占用。
    7. 所以我的方法被认为是有效的设计,或者我应该寻找在IP_address字段上添加时间戳字段,因此如果IP地址的状态自上次查询后发生了更改,那么记录将具有新的时间戳和异常将在申请级别上提出。

      最好的问候

2 个答案:

答案 0 :(得分:2)

对于这种情况,可以认为是正确的做法。它易于实施和维护。你只需记录这一点(纸上和代码)。

时间戳可以用作并发检查,但在您的情况下,将约束添加到数据库是绰绰有余的,因为没有人会插入重复的记录,而其他人尝试将收到消息告诉原因。 (考虑到您将处理特定的例外并显示相应的消息)

答案 1 :(得分:2)

任何应包含唯一值的列都应声明为唯一。约束primary keynot null unique在行为上是相同的。 (例如,不计算隐式聚簇索引的副作用。)

例如,美国的a table of states可能会像这样创建。

CREATE TABLE states (
  state varchar(15) primary key,
  abbr varchar(10) not null unique,
  postal_code char(2) not null unique
);