复杂用户配置文件的JSON或关系表

时间:2015-09-26 22:13:34

标签: postgresql database-design

我正在尝试设计一个Postgres数据库,用于保存有关用户的各种信息,并看到两种明显的方法 - 特别是不同的多关系。

  1. 将基本用户数据存储在 user_info 表中。在单独的表格中,存储许多关系,例如某人所在的学校,他们工作的地方等等。会有很多这样的表格(很容易添加一些东西,比如某人去过的地方,他们读过的书籍等等。我希望这会增长到一个相当大的表格列表)。

  2. 在主 user_info 表中,存储一个JSON blob(当然是正确组织的),包含所有这些附加信息。

  3. 我应该选择以下两个选项中的哪一个?当然,阅读性能更重要。我知道JSON通常比普通的关系表慢,但我不确定从很多不同的表中查找信息(如选项1中)将比获取单个json blob并在浏览器中显示它更慢。另外需要注意的是,Postgres中的JSONB格式实际上有很好的索引选项。

    更新: 根据一些评论,需要使用graphdb:我应该澄清关于技术选择的的问题(rdbms vs graph db)。但是关于给定技术(rdbms)的数据类型的选择。

1 个答案:

答案 0 :(得分:0)

当你不知道你要存储的数据或者它将如何被使用时,NoSQL非常适合,或者它非常适合列表/哈希模型。当您对数据有很多确定性,如何使用数据以及何时适合关系模型时,关系数据库非常适用。我建议采用混合方法,特别是PostgreSQL 9.2's JSON performance improvements

  • 为你认识的事物建立传统关系。
  • 将JSON用于您想要捕获的数据,但不确定是否需要。
  • 对于简单列表,请使用PostgreSQL数组或JSON而不是连接表。
  • 摘要这一切都在模型类之后。
  • 随着您对数据的更多了解,请更改其存储方式。

例如,为PeopleSchoolsWorkPlaces制作表格,并在它们之间连接表格。 People.namePlaces.address等字段是普通列。喜欢"一个人的宠物名单"将其存储为TEXTJSON字段的数组,直到您认为需要Pets表为止。任何额外的信息,你都不会立即知道你将要做什么,以及#34;学校的捐赠有多大?"放入JSON元数据列。

使用模型类可以重构数据库,而不必担心触及数据库的每一段代码。只需确保对表结构做出假设的所有代码都进入模型方法。