【问题标题】:DB Scheme Design for SkygearSkygear DB方案设计
【发布时间】:2017-02-17 09:10:09
【问题描述】:

我应该使用关系数据库模式 (3NF) 来设计 Skygear 的数据存储吗?

例如,我必须要包含用户的用户组,它应该是下面的情况 A 还是 B?

一个。

  • 用户{userId}
  • 组{groupId, groupName}
  • 分组(userId、groupId、角色}

B.

  • 组{userId, groupId, groupName, role}

我认为在传递给应用程序时我最终应该得到以下结果。

{
   "groupName":"Group A",
   "groupId":"G123",
   "administrator":[
      {
         "userId":"U123"
      },
      {
         "userId":"U456"
      }
   ],
   "creator":{
      "userId":"U123"
   },
   "member":[

   ]
}

【问题讨论】:

  • 设计 B 不在 3NF 中;对于每个不同的组合,它出现的用户 ID 和组 ID 都会不必要地重复相同的组名。应用程序根据基表查询它想要的任何内容。关系 DBMS 就是为此而生的。为什么您认为某些查询与最佳数据库设计中的某些表看起来不一样很重要?

标签: postgresql relational-database database-schema skygear


【解决方案1】:

3NF 有利于数据完整性。每个人都喜欢数据完整性,但在您设计应用程序时,它可能并不总是第一要务。

在您提供的情况下,我可能会选择 A。如果 groupName 发生更改,B 需要更新所有 Group

除了考虑数据如何传递到应用程序之外,还要考虑如何更新和创建?


skygear什么时候破3NF?

组中的用户数。

在 3NF 中,您可能会使用聚合函数。 Skygear 还没有提供它,常用的方法是将user_count 列添加到group 记录。并在添加/删除用户时更新号码。

【讨论】:

    【解决方案2】:

    应该使用3NF。

    虽然 skygear 不支持表连接。它具有用于使用外键的记录关系数据类型。 (虽然只有一级)

    https://docs.skygear.io/guides/cloud-db/data-types/android/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多