【问题标题】:Storing multiple attributes in MySQL在 MySQL 中存储多个属性
【发布时间】:2014-10-17 09:56:19
【问题描述】:

我有一个数据库(用于 PHP Web 应用程序),其中的表 client 具有各种属性。 两个这样的属性是phone_numbersemails

一个客户可以有零个或多个电话号码和零个或多个电子邮件。

我想将客户表存储为:

create table client (
  id int not null auto_increment primary key,
  ...
  text phone_numbers,
  text e-mails) default character set utf8

电话号码的格式为"pn1:type1,pn2:type2,...,pnN:typeN" 并且电子邮件的格式为"e1,e2,...,eN"

我以后可能会遇到这种设计的一些重要问题吗?

对于这些问题是否有更好的设计?为什么?

【问题讨论】:

  • 这真的是mysql吗?如果是这样,它的 varchar() 不是文本
  • base64 编码的序列化数组通常用于这种情况。但是 IMO,最好的解决方案是有一个单独的表格,里面有多个电话或电子邮件。
  • 因为您想拥有多个电话和电子邮件。这不是标准化设计。最好有两个单独的表格用于电话和电子邮件。您可以将外键的两列作为 client_id,另一列是电话或电子邮件值。

标签: mysql database-design data-modeling


【解决方案1】:

您考虑的结构没有标准化,并且会给您带来问题......当您搜索时,当您显示数据时,以及在许多其他情况下。

最好有 3 个表:

client      (id, ...)
phonenumber (id, client_id, phone_type, phone_number)
email       (id, client_id, email)

...或只有 2 个表:

client  (id, ...)
contact (id, client_id, contact_type, contact_text)

我更喜欢后者,因为它提供了更大的灵活性(它可以处理社交网络帐户、网页和许多其他联系方式)。它比 3 表结构更易于搜索,并且在您要管理新的联系人类型时无需更改。

【讨论】:

  • 那么当您拥有不止一部手机和一封电子邮件时会发生什么?第二个设计有缺陷。
  • 你为什么这么说?您只有不止一行具有相同的 client_id 和 contact_type。主键是 (id)。唯一键是(client_id、contact_type、contact_text)。
  • @Frazz 谢谢你的回答。如果有人想告诉这个设计问题的重要内容,我让它打开一段时间。
  • @xralf 使用选项 1。标准化后,您应该有一个电话号码表和一个电子邮件表。使用第二个选项时可能会遇到无法预料的障碍。两者都在答案中,因此您仍然应该接受答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多