【发布时间】:2014-07-02 15:12:32
【问题描述】:
所以,我想就如何适当地为业务逻辑域建模获得一些建议。
在不涉及太多 NDA 信息的情况下,我正在尝试对包含项目和人员的相对较大的系统进行建模(目前还没有太可怕)。现在我在 Rails 中构建它只是为了快速推出一些东西,但最终我会将它切换到 Ember.js/JSON 应用程序(这对于这个问题并不重要)。
所以系统有几种不同类型的“人”——有“用户”(可以实际登录系统的人)和“联系人”(有关人的信息,例如电话号码、地址、电子邮件, ETC。)。这两者分开的唯一原因是它们在逻辑上是不同的(登录不需要联系信息,并不是每个“联系人”都需要登录信息或应该能够登录)。一个问题是让这两个实体分开是否有意义,或者我是否应该只制作一个具有所有字段的宽泛、扁平对象来对两个登录进行建模(我正在考虑 Devise 添加的所有字段这里)和所有的字段来做联系信息。
此外,还有项目。项目有不同能力的人作为“联系人”;一个项目可能有“Fred”作为领导或经理,而“Diana”作为客户。另一个项目有可能(尽管不太可能)有“戴安娜”作为领导,而“弗雷德”作为另一个角色。关键是每个联系人在每个项目中扮演的角色是可变的。为了使项目有效(嗯,不一定有效,但活跃),必须填补几个角色。
最后,有点奇怪的是,该应用是多租户的。所以系统本身有多个“客户”(没有更好的术语),他们有自己的客户,所有(顶级)客户数据都必须严格分区。
现在,这就是我正在做的事情:
- 该死的几乎所有东西都有一个“customer_id”字段,这样我就可以确定(我自己的)客户提出的所有请求。
- 如上所述,“用户”(可以登录的人)和“联系人”(关于人的人类有用信息)是分开的。一个“用户”必须有一个“联系人”,但“联系人”不必与“用户”相关联(在 Rails 中,我通过说 User belongs_to Contact 来关联)。这是我第一次不能 100% 确定自己做得对的地方。
- 项目和联系人是多对多连接的(通过连接表),因此一个给定的项目可以有多个联系人(反之亦然)。连接表包含一个“角色”属性,以便我可以说出联系人在项目中扮演的角色。这...有效,但它使 SQL 非常笨拙(我担心,很慢)。诚然,AREL 为我管理大部分 SQL,但仍然要获得体面的查询(并避免 N+1 问题),我必须做很多 .joins/.includes 调用,这对我来说听起来像是一个泄漏的抽象。
所以,我就这样吧,并以我开始的内容结束:有人对如何正确建模这个系统有任何建议或技巧吗?我什至会回答“伙计,这是一个复杂的系统,但你正在尽你所能。” :)
谢谢!
【问题讨论】:
-
我认为你的问题太宽泛了,你应该把它分解成具体的问题。对于第 3 点,您使用的是
has_many through:吗?我假设你是这意味着使用大量的连接/包含肯定是提高效率的最佳方法。
标签: sql ruby-on-rails ember.js devise domain-driven-design