Database-Design
id 和電話號碼是否足以唯一標識電話號碼中的一行
不久前正在設計一張桌子
customer_phone_numbers
,其唯一目的是讓我們能夠儲存使用者想要存檔的盡可能多的電話號碼。我最初得出的結論是customer_id
+phone_number
是唯一的,但後來我想到,同一個使用者有可能在同一個號碼上有 2 個分機。不過,我不確定這種可能性有多大,這會產生另一個問題。phone_number ext 555-555-555, NULL 555-555-555, NULL
變成合法的,除非我找到一個很好的方法來約束 ext 反對 null。規範化和限制電話號碼的最佳方法是什麼?
可能有解決這個問題的方法(例如,代替觸發器而不是顯式約束,或者如果在 2008+ 上使用巧妙的過濾索引),但為什麼呢?
例如,您可以使用 2008+ 中的兩個過濾索引來執行此操作:
CREATE TABLE #cpn(c INT, pn VARCHAR(32), x VARCHAR(8000)); CREATE UNIQUE INDEX x ON #cpn(c, pn) WHERE x IS NULL; CREATE UNIQUE INDEX y ON #cpn(c, pn, x) WHERE x IS NOT NULL; INSERT #cpn(c, pn ) SELECT 1, '555-5555'; -- OK INSERT #cpn(c, pn, x) SELECT 1, '555-5555', '345'; -- OK INSERT #cpn(c, pn, x) SELECT 1, '555-5555', '555'; -- OK GO INSERT #cpn(c, pn ) SELECT 1, '555-5555'; -- fails on index x GO INSERT #cpn(c, pn, x) SELECT 1, '555-5555', '345'; -- fails on index y
但我看不到重點。這似乎是不必要的靈活性。如果我要打電話給辦公室並嘗試通過分機 55 聯繫 Bob,為什麼我更有可能通過分機 67 聯繫到他?對任何人來說,這似乎是一個可行的、真實的場景嗎?
我建議您制定一個業務規則,即使用者只能在同一號碼上擁有一個分機。通過這種方式,您可以保持對客戶 ID 和電話號碼的限制,並允許擴展是可選的。
此外,假設您將電話號碼和分機儲存為字元串,您可以採用另一種方式,讓人們一起輸入它們而不是分開輸入。如果他們想在同一個號碼上輸入 15 個不同的分機,為什麼要阻止他們呢?我也認為允許擴展 0 是愚蠢的,但這也允許這樣做。