SQL,a'多租户'问题:如何将常用数据与用户数据分开?

时间:2015-03-12 11:02:56

标签: sql sqlite multi-tenant

我有一个SQL'建筑'设计疑问,所以我在这里问一下......打扰一下,如果它确实没什么意义,我对SQL很新...: - (

更新正如我刚才所做的那样,感谢评论,这是一个“多租户”问题......

我的应用是一种“联系人管理员” 它将由一些“用户”使用,他们可以访问某些“人”的数据 用户和人员组合是不相交的 应用程序,服务器端定期填充人员的数据 用户可以与人员数据交互,例如添加一些“笔记”或一些额外的“电话”号码 用户添加的数据应该(RW)只能由拥有它的用户访问,并且对其他用户不可见;相反,系统添加的数据应该(RO)可供任何用户访问。

感兴趣的表格如下:

--------------------------
 user
--------------------------
 id | username | password
--------------------------

------------------------------------------------------
 person
-------------------------------------------------------
 id | key | name | age | sex | address | phone | notes
-------------------------------------------------------

“id”字段是“整数自动增量主键”,而“key”字段是该人的唯一标识符。

我到目前为止提出的最佳解决方案是为每个用户添加的数据添加新记录,在人员的表格布局中添加“id_user”字段,在哪里存储拥有该数据记录的用户的ID 。
所以这个人的桌子应该成为:

-----------------------------------------------------------------
 person
-----------------------------------------------------------------
 id | key | name | age | sex | address | phone | notes | id_user
-----------------------------------------------------------------

(当然“常见”数据的“id_user”字段内容应为null或某些特殊保留值。)

我不完全喜欢这个解决方案,因为它复制了每个人的记录,因此提取查询将变得更加复杂,人员表可能会变得非常大...... 我可以想一下如何为不同的用户使用不同的模式,但我不知道这是否合理/可行......

问题是:您认为此解决方案是否可以接受,和/或您认为有更好的选择吗?

P.S。:我目前正在使用sqlite,但最好是标准的SQL答案......

1 个答案:

答案 0 :(得分:1)

我认为,根据架构的复杂程度,有几种方法可以改进它。在任何系统中,您应该决定通常需要选择,编辑或删除哪些数据,它确实有助于选择正确的模型。

  1. 完全分离用户:

    users (id, username, password, name, age, sex, address, phone, notes)
    persons (id, key, name, age, sex, address, phone, notes)
    

    如果您一次仅查询用户信息或仅查询个人信息,则无意在一个表格中加入他们的信息。

  2. 将个人资料数据存储在单独的表格中:

    users (id, username, password, profile_id)
    persons (id, key, profile_id)
    profiles (id, name, age, sex, address, phone, notes)
    

    它可以帮助查询所有用户的电话和一个选择中没有联合的人。

  3. 反向依赖:

    users (id, username, password)
    persons (id, key)
    profiles (id, type, parentid, pname, age, sex, address, phone, notes)
    
  4. 其中type对于用户为0,对于人为1,parentid为来自idusers的{​​{1}}。 eav模型的排序,将有助于某人需要几个配置文件。

    1. 如果正在使用多个配置文件(可能将来使用),那么比3更好的方法是使用过渡表:

      persons

      它也可以帮助人,也是用户(可能是不相关的人和用户是暂时的)。

    2. 与之前相反,您可以将用户和个人加入一个表格

      users (id, username, password)
      persons (id, key)
      user_or_person_profiles (type, parentid, profile_id)
      profiles (id, pname, age, sex, address, phone, notes)
      

      其中people (id, groupid, username, password, key, name, age, sex, address, phone, notes) 可以是预定义的const(0表示用户,1表示人员),或groupid表中的id,可用于构建" group-role-permission&#34 ;用户权利系统就像您需要或想象的那样复杂。

    3. 同样,什么模式更好,只有你可以决定,知道你将操纵什么数据和频率。

      希望,它会以某种方式帮助......