【问题标题】:Database schema design for records of nested JSON嵌套 JSON 记录的数据库模式设计
【发布时间】:2012-12-20 23:30:50
【问题描述】:

我有一个profile 记录列表,每条记录如下:

{
  "name": "Peter Pan",
  "contacts": [
    {
      "key": "mobile",
      "value": "1234-5678"
    }
  ],
  "addresses": [
    {
      "key": "postal",
      "value": "2356 W. Manchester Ave.\nSomewhere District\nA Country"
    },
    {
      "key": "po",
      "value": "PO Box 1234"
    }
  ],
  "emails": [
    {
      "key": "work",
      "value": "abc@work.com"
    },
    {
      "key": "personal",
      "value": "abc@personal.com"
    }
  ],
  "url": "http://www.example.com/"
}

我会考虑采用以下架构结构:

  1. 带有idname 字段的profile 表。
  2. 带有idprofile_idkeyvalue 字段的profile_contact 表。
  3. 带有idprofile_idkeyvalue 字段的profile_address 表。
  4. 带有idprofile_idkeyvalue 字段的profile_email 表。

但是,我认为我为这样一个简单的 JSON 创建了太多表!

  1. 跨表搜索时是否会出现性能问题,因为执行了许多 JOINS 来检索一条记录?
  2. 将上述 JSON 记录建模到数据库中的更好方法是什么?在 SQL 中,还是在 NoSQL 中更好?

【问题讨论】:

  • 你不能在 sql 的表中设计“嵌套”列。
  • @DerekFloss,不在一张桌子上,可能是几张桌子?

标签: sql database json database-design nosql


【解决方案1】:

这取决于。 如果您打算让每个用户拥有“无限”数量的联系人/地址/电子邮件,那么您的想法是一个不错的选择。

您还可以考虑(类似)以下内容:

PROFILE 表,包含:

  • PROFILE_ID
  • NAME
  • EMAIL_ADDRESS_WORK
  • EMAIL_ADDRESS_PERSONAL
  • PHONE_NUMBER
  • MOBILE_NUMBER

ADDRESS 表,包含:

  • ADDRESS_ID
  • PROFILE_ID
  • STREET
  • CITY
  • ..等

这意味着您可以为每个用户设置 2 种电子邮件和 2 种电话号码,它们与个人资料本身一起存储。

或者,您可以选择使用单独的 CONTACT 表,其中包含电话号码和电子邮件地址(可能还有其他类型):

  • CONTACT_TYPE(电话、手机、email_work、email_personal)
  • CONTACT_VALUE
  • PROFILE_ID

这三个(我的和你的)都可以完美运行。为了更好地决定什么对你有用,你应该写下所有存在(并且可能存在)的可能性。也许您希望能够为每个个人资料添加 10 个电子邮件地址(然后将它们与个人资料一起存储会很愚蠢),也许您在不同的联系人类型中会有很大的变化,例如 IM、facebook、ICQ、twitter(然后CONTACTS 表非常适合)。

所以试着找出/列出你将拥有的数据类型,看看它们如何适合特定模型,然后选择最合适的一个:)

【讨论】:

    【解决方案2】:

    这是数据库设计中最常见的情况......你应该停止将它作为新事物仅仅因为你包含了 json :-)

    只需创建

    用户:id、姓名

    联系人:user-id、id、key、value

    电子邮件和地址以及其他类似联系人的信息。

    现在您只需从 user 中选择并在 user.id=id 上内连接其他表

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-20
      • 2019-08-07
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      • 2018-01-26
      相关资源
      最近更新 更多