AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 19039
Accepted
xenoterracide
xenoterracide
Asked: 2012-06-11 10:57:13 +0800 CST2012-06-11 10:57:13 +0800 CST 2012-06-11 10:57:13 +0800 CST

id 和电话号码是否足以唯一标识电话号码中的一行

  • 772

前一段时间正在设计一张桌子customer_phone_numbers,其唯一目的是让我们能够存储用户想要的尽可能多的电话号码。我最初得出的结论是customer_id+phone_number是唯一的,但后来我想到,同一个用户有可能在同一个号码上有 2 个分机。我不确定这种可能性有多大,这会产生另一个问题。

phone_number ext
555-555-555, NULL
555-555-555, NULL

变得合法,除非我找到一个很好的方法来限制 ext 以防止 null。规范化和限制电话号码的最佳方式是什么?

database-design normalization
  • 3 3 个回答
  • 729 Views

3 个回答

  • Voted
  1. Best Answer
    Aaron Bertrand
    2012-06-11T15:20:38+08:002012-06-11T15:20:38+08:00

    可能有解决此问题的方法(例如,代替触发器而不是显式约束,或者如果在 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 的扩展是愚蠢的,但这也允许。

    • 3
  2. Jon of All Trades
    2012-06-12T07:25:34+08:002012-06-12T07:25:34+08:00

    只是把它扔在那里:您可以将 PK 放在 { CustomerID, PhoneType } 上。您会存储一些关于每个电话号码含义的上下文,这可能很有用。

    如果将 PhoneType 设置为自由文本字符串而不是 PhoneTypes 维度表的 FK,则允许每个客户的电话号码数量不定(或者您可以将其设置为 FK,但允许用户创建新的电话类型,尽管我不会不要走得太远)。不过,请务必鼓励用户首先从常用电话类型列表(工作、家庭、手机、传真)中进行选择。

    • 2
  3. AmmarR
    2012-06-11T13:02:48+08:002012-06-11T13:02:48+08:00

    您不能在 sql server 中创建 UNIQUE 约束并允许 NULL,所以我想您可以在 ext 中存储默认值 0,并且在显示它时使用 case 将 ext 显示为空值

    Select 
    customer_id, 
    phone_number, 
    ext = case when ext = 0 then '' else ext  
    end
    
    • 0

相关问题

  • 存储计算值或根据要求重新计算它们更好吗?[复制]

  • 存储与计算聚合值

  • 在数据仓库中实现多对多关系有哪些方法?

  • 高级规范化形式是否总是符合低级规范化形式的标准?

  • 标准化练习资源

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve