需要有关域建模的建议

时间:2014-07-02 15:12:33

标签: sql ruby-on-rails ember.js devise domain-driven-design

所以,我想就如何正确建模业务逻辑域提出一些建议。

在没有进入太多NDA信息的情况下,我正在尝试建模一个包含项目和人员的相对较大的系统(到目前为止没什么可怕的)。现在我正在Rails中构建它只是为了快速获得一些东西,但最终我将把它切换到一个Ember.js / JSON应用程序(不是那个问题非常重要)。

因此系统有几种不同类型的“人” - 有“用户”(可以实际登录系统的人)和“联系人”(有关人员的信息,如电话号码,地址,电子邮件)等)。这两者分开的唯一原因是它们在逻辑上是不同的(登录时不需要联系信息,并且不是每个“联系人”都需要登录信息或者应该可以登录)。一个正确的问题是,将这两个实体分开是否有意义,或者我是否应该创建一个宽广的平面对象,并使用所有字段对两个登录进行建模(我正在考虑设计所添加的所有字段)这里)以及所有要联系信息的字段。

此外,还有一些项目。项目将人们视为不同能力的“联系人”;一个项目可能有“Fred”作为主管或经理,“Diana”作为客户。有可能(尽管不太可能)另一个项目可能有“戴安娜”作为领导,“弗雷德”作为另一个角色。关键是每个联系人在每个项目中扮演的角色都是流动的。有一些角色需要填写才能使项目有效(好吧,不一定有效,但有效)。

最后,对于扭曲,该应用程序是多租户。因此,系统本身有多个“客户”(缺乏更好的术语),他们拥有自己的OWN客户,并且所有(顶级)客户数据必须严格分区。

现在,这就是我正在做的事情:

  1. Darn附近的所有地方都有一个“customer_id”字段,因此我可以将(我自己的)客户的所有请求作为范围。
  2. 如上所述,“用户”(可以登录的人)和“联系人”(关于人的人类有用信息)是分开的。一个“用户”必须有一个“联系人”,但“联系人”不必与“用户”相关联(在Rails中,我通过说“用户所属的联系人”来关联它)。这是第一个我不能100%确定我做得对的地方。
  3. 项目和联系人多对多联接(通过联接表),以便给定项目可以有多个联系人(反之亦然)。连接表包含“角色”属性,以便我可以说明联系人在项目中扮演的角色。这......工作,但它使SQL非常笨重(我担心,慢)。是的,AREL为我管理大部分SQL,但仍然要获得不错的查询(并避免N + 1问题),我必须做很多.joins / .includes调用,这对我来说听起来像是一个漏洞的抽象。 / LI>

    所以,我会把它留在那里,并以我的开头结束:任何人都有任何关于如何正确建模这个系统的建议或提示?我甚至会回答“伙计,这是一个复杂的系统,但你正在做的最好的事情。” :)

    谢谢!

1 个答案:

答案 0 :(得分:0)

以下是我将如何处理它......

首先,图表就是一切!也许你已经完成了这个或者没有,但我总是创建一个图表,显示所有不同的参与者(在这种情况下,用户,联系人,客户和客户的客户)并绘制他们的关系。

其次,我不会将用户和联系人分开。如果联系人成为用户怎么办?如果用户下载到联系人该怎么办?等等,这些都是你必须问自己的问题 - 那些“假设”情景虽然现在可能不太可能,但可能会在以后出现。如果用例发生变化,您将希望系统尽可能灵活。

所以,我会创建一个“用户”表并给他们一个权限列。此人是用户还是联系人?如果此人是用户,则不要求联系信息,但如果他们是联系人,则需要,但他们无法登录。此外,如果此人同时是用户,您可能应该有另一个选项联系。

然后,我会为客户的客户的多对多用例提供单独的“关系”表。类似的东西:

| ID | UserID | CustomerID |
-----------------------------
|  1 |      2 |          3 |
|  2 |      2 |          4 |
|  3 |      2 |          5 |
|  4 |      7 |          6 |

UserID是父客户的ID,CustomerID是子客户的ID。然后你可以约束谁看到了什么。

对于你的项目问题,同样的事情,我会创建一个名为ProjectRoles的单独模型/表,它具有项目ID,用户ID和角色名称。在确保表格设置稳定/持久并且还可以快速加载查询之间取得了很好的平衡。我宁愿第一次做对了!