设计问题:如何为基于SAAS的应用程序设计数据模型?

时间:2013-04-22 19:09:54

标签: database data-modeling saas

为基于SAAS的模型设计STANDARD和USER SPECIFIC记录的数据模型。

在我的基于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 OR ROLE.COMPANY_ID =

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

  3. 我可以为每个租户创建标准记录的副本,并将它们分配给自己的company_id。但是这里的通道是,我将为每个租户提供至少80个标准记录,如果我期望1000个免费线路租户,我将最终分配80,000个记录空间。有这个设计的想法吗?不是三叶草选项,但选择此选项时不会留下任何选项..

  4. 相反,我希望有一份标准记录副本,所有租户都可以共享,因为它们是SYSTEM记录。

    对于SAAS初创公司的可编程性,维护,数据库空间,Perfect先生设计的任何想法。

2 个答案:

答案 0 :(得分:0)

我见过几个选项。

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

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

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

1)让Hibernate调用一个存储过程来管理这两组。

2)在你的收藏中有两个电话和汇编。您至少会缓存标准角色,因为它们不是易变的。所以这不会增加性能。

答案 1 :(得分:0)

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

实体: 公司(COMPANY_ID,NAME) ROLE(ROLE_ID,ROLE_TYPE_ID,COM​​PANY_ID,NAME) ROLE_TYPE(ROLE_TYPE_ID,PARENT_ROLE_TYPE_ID),NAME)

关系: 公司到角色是1:M ROLE_TYPE到ROLE是1:M ROLE_TYPE到ROLE_TYPE是1:M