前一段时间正在设计一张桌子customer_phone_numbers
,其唯一目的是让我们能够存储用户想要的尽可能多的电话号码。我最初得出的结论是customer_id
+phone_number
是唯一的,但后来我想到,同一个用户有可能在同一个号码上有 2 个分机。我不确定这种可能性有多大,这会产生另一个问题。
phone_number ext
555-555-555, NULL
555-555-555, NULL
变得合法,除非我找到一个很好的方法来限制 ext 以防止 null。规范化和限制电话号码的最佳方式是什么?
可能有解决此问题的方法(例如,代替触发器而不是显式约束,或者如果在 2008+ 上使用巧妙的过滤索引),但为什么呢?
例如,您可以在 2008+ 中使用两个过滤索引来执行此操作:
但我不明白这一点。这似乎是不必要的灵活性。如果我要打电话给办公室并尝试在分机号 55 与 Bob 联系,为什么我更有可能在分机号 67 与他联系?这对任何人来说都是可行的、真实的场景吗?
我建议您制定一个业务规则,即一个用户在同一号码下只能拥有一个分机。这样您就可以保留对客户 ID 和电话号码的限制,并允许分机是可选的。
此外,假设您将电话号码和分机号存储为字符串,您可以采用另一种方式让人们一起输入而不是分开输入。如果他们想用同一个号码输入 15 个不同的分机,为什么要阻止他们呢?我也认为允许 0 的扩展是愚蠢的,但这也允许。
只是把它扔在那里:您可以将 PK 放在 { CustomerID, PhoneType } 上。您会存储一些关于每个电话号码含义的上下文,这可能很有用。
如果将 PhoneType 设置为自由文本字符串而不是 PhoneTypes 维度表的 FK,则允许每个客户的电话号码数量不定(或者您可以将其设置为 FK,但允许用户创建新的电话类型,尽管我不会不要走得太远)。不过,请务必鼓励用户首先从常用电话类型列表(工作、家庭、手机、传真)中进行选择。
您不能在 sql server 中创建 UNIQUE 约束并允许 NULL,所以我想您可以在 ext 中存储默认值 0,并且在显示它时使用 case 将 ext 显示为空值