2015-02-24 52 views
1

我有一个概念性问题。SQL表OR域

我的数据库有一张表,用于存储有关人员的信息。其中一个字段是他们的电话号码(我的国家是8位数字)。

事情是,在某些情况下,两个或更多的人将有相同的电话号码。

我的问题是:将电话号码存储在另一张桌子上,然后通过外键引用它,而不是将它们存储为字段,会是更好的选择吗?如果是这样,结果对于任何数据库的大小是?

我不知道这是否会产生任何影响,但表格将不会超过600.000 - 800.000条记录,我猜这些重合的电话号码将占记录总数的10%左右。

编辑:

- 每个记录最多可以有4个电话号码(两条线和两个单元)

导向轴的情况下会发生,会有有时当用户将寻找所有具有特定号码的人,以及用户想知道什么是一个人的所有电话号码的时间

+0

如果每个用户只有一个电话号码,则可以保持原样。 – Alex 2015-02-24 21:05:11

+0

对不起,我没有这样说,我编辑了这个问题。每个人最多可以有4个号码 – 2015-02-24 21:09:06

+1

我会问这个问题。如果一个用户的号码发生变化,这是否意味着号码相同的所有用户都会改变?如果是这样,我会使用一个单独的表格。否则,这似乎没有多大意义。 – dan08 2015-02-24 21:09:13

回答

1

从技术上来说,你需要一个单独的电话号码表,然后是一个PersonPhonenumber表。

但是,实际上我很少看到这个电话号码和地址的结构。首先,当你只是想改变一个人时,很容易犯一个错误,更新一个人以上的地址或电话。对于另一个它增加了一个额外的连接,似乎并不需要大多数人。除了少量的重复之外,你并没有真正获得这个水平。

真正的决定因素是你如何使用和更新数字。如果要频繁更新所有具有相同号码的人员,最好完全标准化。如果您通常只需要一次更新一个人,那么只有一个人员表格和一个人员电话号码表格可能风险较小。

如果你想要历史记录,那么我会去一个人表和aPersonPhoneNumber历史表。它将具有personid,电话号码,开始日期和结束日期。所以当约翰和玛丽离婚时,他的电话号码会有一个结束日期,但是她的电话号码不是,你可以清楚地看到谁有电话号码。

+0

我明白了你的观点,这正是我的问题所在。但是,关于性能。你会建议创建两个表格(PhoneNumbers和ContactHistory),或者只有一个表格并存储它吗?我只是担心接触历史的问题,我们会谈论每天增加约2000条记录。给我建议,我很乐意接受你的回答。 – 2015-02-24 21:37:45

+0

有很好的索引,性能可能会好,但我不是mysql专家,因为我更熟悉SQL Server。如果您选择将历史记录与当前电话号码分开,请确保从触发器填充历史记录表以确保记录所有更改。 。 – HLGEM 2015-02-24 21:53:36

0

通常电话号码只是一个数字,并且没有人没有任何意义。 所以你把它存储在Person表中。

但是,您为电话公司工作的电话号码具有不同的含义和用途(如历史记录,电话查询,计费),则应将其存储在单独的表格中。我希望它有帮助。

+1

切勿将分隔符用于多个数字。如果你每个人有多个电话号码,那么应该是一个相关的表格。我同意你所说的其余部分,但存储逗号分隔列表是一个sql防范。 – HLGEM 2015-02-24 21:13:46

+0

它的确有帮助,它不是电话公司,但手机确实会用于其他一些原因(电话lokup和历史将是最常见的)。将他们separating提高性能显着? – 2015-02-24 21:14:03

+1

我同意分隔符是一个坏主意。对于电话查询,您可以在电话号码列上进行索引。对于历史它不起作用。 – MaxZoom 2015-02-24 21:21:00

1

如果每个人更多的则1个电话号码

有一个很好的理由来设置新的表所示: id, user_id, phone, type, description

所以type可能是 家庭,工作,Office2,老板名单,妻子,传真,手机等...

description“工作时间只”, “黄昏”, “全天候”,“紧急ONL y“等

如果您真的为您的应用程序管理电话簿,将电话号码与原始用户表分开是个好主意。

0

如果您有两个拥有相同电话号码的人,则在搜索特定电话号码时会遇到问题。搜索特定的电话号码有时会返回多个结果(根据您的估算,为10%)。如果您通过电话号码和人进行搜索,则可以要求所有电话号码搜索都包含用户标识符(名,姓,地址等)。这取决于你的目标是什么。

+0

这两种情况都会发生,有时候用户会在哪里查找所有具有特定号码的人,以及用户想要知道一个人拥有的电话号码是什么的时间 – 2015-02-24 21:20:49