2

为基于 SAAS 的模型的标准和用户特定记录设计数据模型。

在我的基于 SAAS 的应用程序中,我有用户及其关联的(一对一)角色。租户可以创建自己的特定于其公司的角色并分配给他们的用户。并且 SYSTEM 提供了一些标准角色供租户使用。SYSTEM 定义的标准角色对所有租户都是通用的。

我的 ROLE 和 COMPANY 表如下:

表:公司

    COMPANY_ID   |  COMPANY_NAME    
    100          |  Acme Inc.
    101          |  E Technologies.

表:角色

    ROLE_ID |   COMPANY_ID  | ROLE_NAME         | IS_STANDARD_ROLE
    1       |               | ADMINISTRATOR     |Yes
    2       |               |MANAGER            |Yes
    3       |   100         |MyAdmin            |No
    4       |   100         |MySpecialist       |No
    5       |   101         |Supervisor         |No

这里我有 ROLE.COMPANY_ID 引用 COMPANY.COMPANY_ID

我试图找出在同一个表中同时容纳标准角色和用户定义角色的最佳方法,并让带有注释的 Hibernate 3.0 可以轻松提取。

这是我现有的替代方案。

  1. 我可以在上面的同一个表中同时拥有标准和客户定义的角色,并将 ROLE.COMPANY_ID 字段留空(如果 mysql 允许)作为标准。但挑战是 hibernate3.0 拉 ROLE.COMPANY_ID=100 或 ROLE.COMPANY_ID=

  2. 我可以在 company 表中定义一个名为 SYSTEM 的虚拟公司,并将所有标准/SYSTEM 记录引用到名为 SYSTEM 的公司。同样的挑战是在hinernate 3.0 中使用或使用aootations 提取记录。不确定,如何在没有自定义 HQL 的情况下使用注释在休眠 3.0 上执行此 OR 子句?有些方法,团队不喜欢数据库中的虚拟公司记录的想法。

  3. 我可以为每个租户创建标准记录的副本并将它们分配给他们自己的 company_id。但是这里的问题是,我将为每个租户至少有 80 条标准记录,如果我预计有 1000 个免费试用租户,我最终将分配 80,000 条记录空间。这个设计有什么想法吗?不是三叶草选项,但选择这个没有任何选项。

相反,我更愿意拥有一份标准记录,所有租户都可以共享,因为它们是系统记录。

对完美先生在可编程性、维护性、用于 SAAS 启动的数据库空间方面的设计有何想法?

4

2 回答 2

0

我看过几个选项。

我更喜欢有两张表,一张用于标准角色,一张用于客户定义的角色。这很微妙,但它们本质上是两个不同的实体:所有租户共有的角色和租户自定义角色。这些最终可能会在属性和/或关系上有所不同。

另一种是将它们整理在一个表格中,就像您的前两个建议一样,这基本上是相同的解决方案。我不喜欢这样的原因是您重载了 COMPANY_ID 的定义。您几乎总是会后悔重载列定义。

无论哪种方式,我都会选择以下方法之一:

1) 让 Hibernate 调用联合这两个集合的存储过程。

2) 有两个电话并在您的收藏中集合。至少您会缓存标准角色,因为它们不是易失性的。所以这不会增加性能损失。

于 2014-03-29T14:50:32.840 回答
0

您可以将 ROLE TYPE 实体添加到您的数据模型中,该实体对 ROLE 中的角色进行分类。我认为这比公司 ID 中的空白要好。如果需要,它还允许您构建角色层次结构 - 只需添加 PARENT ROLE 属性和递归关系。

实体:COMPANY (COMPANY_ID, NAME) ROLE (ROLE_ID, ROLE_TYPE_ID, COMPANY_ID, NAME) ROLE_TYPE (ROLE_TYPE_ID, PARENT_ROLE_TYPE_ID), NAME)

关系:COMPANY 到 ROLE 是 1:M ROLE_TYPE 到 ROLE 是 1:M ROLE_TYPE 到 ROLE_TYPE 是 1:M

于 2014-04-02T13:36:21.930 回答