【问题标题】:Database Design for Expanding Lists扩展列表的数据库设计
【发布时间】:2012-01-06 23:13:12
【问题描述】:

诚然,我只是在这里寻找一些方向。我有一个特定的情况,作为数据库设计的新手,我不知道如何开始解决这个问题。让我先解释一下我的情况。

我有一个名为contacts 的mysql 表。顾名思义,它存储了一个联系人列表以及每个联系人的属性,例如名字、姓氏、电子邮件、电话号码等。我希望我的应用程序的用户能够添加无限数量的某些每个联系人的属性。因此,例如,不是一个联系人拥有一个电话号码,用户可以添加另一个号码,如果他们选择另一个号码,那么本质上,我的数据库中的一个联系人可以拥有用户需要的尽可能多的电话号码。这也适用于表中的其他字段,但为了简单起见,我们仅以电话号码为例。

那么解决这个问题的最佳方法是什么?我是否应该有一个名为 contactsPhone 的单独表并有一个匹配的 id 列,以便电话表中的任意数量的行都可以与联系人表中的一行相关联?或者有没有办法在联系人表中存储某种类型的 ArrayList,这样我就可以在一个字段中拥有多个电话号码?

【问题讨论】:

  • 您可能应该查看文档数据库而不是关系数据库,因为您需要灵活的“模式”。
  • 我的应用程序已经与 mysql 紧密耦合,因此切换数据库不是一种选择。

标签: database database-design


【解决方案1】:

您应该在document database 中查看类似这样的建模 - 关系数据库对于灵活的模式来说是一个糟糕的选择。您可以只在文档数据库中保存您的这部分数据。

如果您必须,常见的解决方案是entity-attribute-value pattern - 请注意,这需要多个连接,使临时查询变得困难并且通常很慢。


更新:

我有点误读了这个问题 - 如果您确实知道要保存多个值的属性并且此列表不会更改(或更改不大),那么 entity-attribute-value 可能不是最好的前进方式。

每个属性的一对多表都可以工作(并且是此类问题的标准关系解决方案) - 每个这样的表都需要一个外键到您的联系人表和一个列来保存单个属性值。这允许您针对单个联系人拥有多个属性值。

【讨论】:

  • 您是否有任何特定资源可以帮助我学习设置和实施 nosql 数据库?我使用 Java 和一个快速的谷歌引导我到 orientDB?可能的好选择?
  • @ryandlf - CouchDB 和 MongoDB 现在非常流行。请参阅链接的维基百科文章。
  • OP 没有描述无限数量的属性。他正在描述单个属性的无限(或多或少)行数。
  • @Catcall - 很好的收获。我误读了这个问题,答案更新了。
【解决方案2】:

我希望我的应用程序的用户能够添加无限 每个联系人的某些属性的数量。所以,例如, 与拥有一个电话号码的联系人相比,用户可以添加另一个 号码,如果他们选择等的话,另一个,我的联系人 数据库可以拥有用户需要的任意数量的电话号码。

您不是在为每个联系人描述无限数量的属性。 (这是一件好事。)您正在为单个属性描述无限数量的行,在本例中是联系人的电话号码。

所以,是的,联系电话号码表会很好用。您可能想考虑一下用户可能希望如何识别电话号码。例如,他们是否需要区分家庭电话号码和工作号码等等。

【讨论】:

  • 是的,如果合适的话,电话号码会被分段,我认为一个简单的“类型”列就可以了。我不得不承认,nosql 方法确实比使用联系人表、contactsPhone、contactsAddresses、contactEmails 等要干净得多。
  • @ryandlf:我敢肯定,如果 Oded 理解您的问题以及理解您的话,他不会推荐文档数据库。
猜你喜欢
  • 2011-09-01
  • 2011-02-14
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 2011-02-19
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多