【问题标题】:Need advice on domain modeling需要有关领域建模的建议
【发布时间】:2014-07-02 15:12:32
【问题描述】:

所以,我想就如何适当地为业务逻辑域建模获得一些建议。

在不涉及太多 NDA 信息的情况下,我正在尝试对包含项目和人员的相对较大的系统进行建模(目前还没有太可怕)。现在我在 Rails 中构建它只是为了快速推出一些东西,但最终我会将它切换到 Ember.js/JSON 应用程序(这对于这个问题并不重要)。

所以系统有几种不同类型的“人”——有“用户”(可以实际登录系统的人)和“联系人”(有关人的信息,例如电话号码、地址、电子邮件, ETC。)。这两者分开的唯一原因是它们在逻辑上是不同的(登录不需要联系信息,并不是每个“联系人”都需要登录信息或应该能够登录)。一个问题是让这两个实体分开是否有意义,或者我是否应该只制作一个具有所有字段的宽泛、扁平对象来对两个登录进行建模(我正在考虑 Devise 添加的所有字段这里)和所有的字段来做联系信息。

此外,还有项目。项目有不同能力的人作为“联系人”;一个项目可能有“Fred”作为领导或经理,而“Diana”作为客户。另一个项目有可能(尽管不太可能)有“戴安娜”作为领导,而“弗雷德”作为另一个角色。关键是每个联系人在每个项目中扮演的角色是可变的。为了使项目有效(嗯,不一定有效,但活跃),必须填补几个角色。

最后,有点奇怪的是,该应用是多租户的。所以系统本身有多个“客户”(没有更好的术语),他们有自己的客户,所有(顶级)客户数据都必须严格分区。

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

  1. 该死的几乎所有东西都有一个“customer_id”字段,这样我就可以确定(我自己的)客户提出的所有请求。
  2. 如上所述,“用户”(可以登录的人)和“联系人”(关于人的人类有用信息)是分开的。一个“用户”必须有一个“联系人”,但“联系人”不必与“用户”相关联(在 Rails 中,我通过说 User belongs_to Contact 来关联)。这是我第一次不能 100% 确定自己做得对的地方。
  3. 项目和联系人是多对多连接的(通过连接表),因此一个给定的项目可以有多个联系人(反之亦然)。连接表包含一个“角色”属性,以便我可以说出联系人在项目中扮演的角色。这...有效,但它使 SQL 非常笨拙(我担心,很慢)。诚然,AREL 为我管理大部分 SQL,但仍然要获得体面的查询(并避免 N+1 问题),我必须做很多 .joins/.includes 调用,这对我来说听起来像是一个泄漏的抽象。

所以,我就这样吧,并以我开始的内容结束:有人对如何正确建模这个系统有任何建议或技巧吗?我什至会回答“伙计,这是一个复杂的系统,但你正在尽你所能。” :)

谢谢!

【问题讨论】:

  • 我认为你的问题太宽泛了,你应该把它分解成具体的问题。对于第 3 点,您使用的是 has_many through: 吗?我假设你是这意味着使用大量的连接/包含肯定是提高效率的最佳方法。

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


【解决方案1】:

这就是我将如何解决它...

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

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

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

然后,我将为客户与客户的客户的多对多用例创建一个单独的“关系”表。比如:

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

UserID 是父客户的 ID,CustomerID 是子客户的 ID。然后,您可以限制谁看到了什么。

对于您的项目问题,同样的事情,我会创建一个名为 ProjectRoles 的单独模型/表,其中包含项目 ID、用户 ID 和角色名称。在确保表设置稳固/持久和快速加载查询之间取得了很好的平衡。我宁愿第一次就对!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    相关资源
    最近更新 更多