为基于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可以毫不复杂地提取。
以下是我现有的替代方案。
我可以在上面的同一个表中同时拥有标准和客户定义的角色,并将ROLE.COMPANY_ID字段留空(如果mysql允许)为标准。但挑战是hibernate3.0同时拉入ROLE.COMPANY_ID = 100 OR ROLE.COMPANY_ID =
我可以在公司表中定义一个名为SYSTEM的虚拟公司,并将所有标准/ SYSTEM记录引用到名为SYSTEM的公司。同样的挑战是在带有aootations的hinernate 3.0中用OR拉记录。 不确定,如何在没有自定义HQL的情况下在带有注释的hibernate 3.0上执行此OR子句?如何,团队不喜欢数据库中虚拟公司记录的想法。
我可以为每个租户创建标准记录的副本,并将它们分配给自己的company_id。但是这里的通道是,我将为每个租户提供至少80个标准记录,如果我期望1000个免费线路租户,我将最终分配80,000个记录空间。有这个设计的想法吗?不是三叶草选项,但选择此选项时不会留下任何选项..
相反,我希望有一份标准记录副本,所有租户都可以共享,因为它们是SYSTEM记录。
对于SAAS初创公司的可编程性,维护,数据库空间,Perfect先生设计的任何想法。
答案 0 :(得分:0)
我见过几个选项。
我首选的是有两个表,一个用于标准角色,另一个用于客户定义的角色。这是微妙的,但它们本质上是两个不同的实体:所有租户共有的角色和租户自定义角色。它们最终可能在属性和/或关系上有所不同。
另一种是在前两个建议中将它们整理到一个表中,这两个建议基本上是相同的解决方案。我不喜欢这样的原因是你重载了COMPANY_ID的定义。您几乎总是后悔重载列定义。
无论哪种方式,我都会选择以下方法之一:
1)让Hibernate调用一个存储过程来管理这两组。
2)在你的收藏中有两个电话和汇编。您至少会缓存标准角色,因为它们不是易变的。所以这不会增加性能。
答案 1 :(得分:0)
您可以添加一个ROLE TYPE实体,该实体将ROLE中的角色分类到您的数据模型。我认为这比公司ID中的空白更好。它还允许您根据需要构建角色层次结构 - 只需添加PARENT ROLE属性和递归关系。
实体: 公司(COMPANY_ID,NAME) ROLE(ROLE_ID,ROLE_TYPE_ID,COMPANY_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