0

两部分问题:

第 1点:当引用对象的某些属性/属性并不总是必需时,为引用另一个对象的对象创建模型的最佳方法是什么?

想象一下,如果你有两个对象:PERSONBUSINESS

Person
+ PersonID
+ Name
+ Age
+ Sex
+ Skill
+ Business *

Business
+ BusinessID
+ Name
+ Address
+ CorporateVision (this is large)

在上面的示例中:PERSONBUSINESS作为其当前雇主。

在数据库中,每个对象都有两个表。在代码中,使用 MVC 架构模式,我将为每个对象创建两个类。数据库将在BUSINESS --> PERSON之间具有外键关系,而在代码中PERSON对象将有一个成员变量,该变量包含对BUSINESS对象的引用。

现在假设我想列举PERSONS的集合并找出为特定公司工作的人的总数(基于BUSINESS . Name)。

如果不使用 MVC,我可以创建一个查询数据库并获得计数的函数。简单而有效。

使用 MVC,我需要实例化每个PERSON对象,而后者又会实例化一个BUSINESS对象以供参考(如果尚未为它完成... BusinessFactory将首先检查一个集合)。此外,它必须拉入BUSINESSCorporateVision从数据库中获取每个对象。而且由于这些企业中的大多数都是媒体营销公司,因此他们的大多数企业愿景都是大文本块。因此,当我们只需要企业名称时,就没有必要从数据库中读取 CorporateVision。

我可以通过将代码中的PERSON对象更改为:

Person
+ PersonID
+ Name
+ Age
+ Sex
+ Skill
+ BusinessID
+ BusinessName

所以现在当我创建我的PERSON对象时,我会与BUSINESS进行 JOIN并缓存名称。现在我可以快速有效地获取 BusinessName ......而且我仍然可以根据需要通过查找 ID来获取完整的BUSINESS对象。但我只是对模型进行了非规范化......我刚刚引入了一个新问题......和一个新问题。

数字 2:MVC 如何处理多用户数据库的并发性?

可以说,当我的客户端应用程序正在枚举时(使用我上面提到的枚举来查找为特定业务工作的所有人员),另一个用户合并了两个BUSINESS对象。

现在我的内存集合是错误的,因为所有的 BusinessName 缓存都是陈旧的。如果我刚刚离开PERSON ,情况也是如此。业务作为业务对象引用:业务对象将是陈旧的。

总结:我觉得使用 MVC 会失去数据检索效率以及应用程序的 ACIDness。还是我使用 MVC 错误?

4

1 回答 1

0

您似乎混合了 UI 和数据访问,而您应该尽量减少它们对另一个的依赖。MVC 实际上是一个非常广泛的模式,它描述了应用程序如何与用户交互。您的两个问题都与数据访问有关。

1) MVC 是您组织 UI 的方式。因此,模型是您希望让用户与之交互的一条信息。请注意,这里的业务对象不是优先级。如果存在使用从 加载一个Person类以及几个属性的情况Business,那就这样吧:您的第二个 Person 再现是这种情况的完美模型。依此类推——每个用例都需要不同的模型,您应该为不同的场景创建不同的模型。

如果您认为调用函数来计算数字更容易 - 很好。请记住,您在此处不受业务对象的约束。

使用更“面向对象”的方法,我们通常以两种方式解决这个参考问题:

  • 首先是延迟加载,它是现代 O/RM 的开箱即用功能。所以你加载一个人,在第一次调用 Person.Business 后,后者会自动加载。
  • 其次是你创建了一个特殊的 UI,它知道你的数据访问细节,或者只有你使用的字段,或者以异步方式从客户端请求额外的数据。

2) 同样,MVC 不处理并发,它不应该处理它,甚至不应该打扰。这是数据访问层的问题。处理并发的方式也有好几种,主要是乐观锁和悲观锁。(使用第一种方法,您允许不同的用户进行冲突更改并在发生冲突时尝试解决冲突。第二种方法通过完全锁定更新来防止冲突)。同样,O/RM 通常会处理它;或者您可以使用自己的实现,但它应该仍然是数据访问,而不是 MVC 部分。

于 2013-04-02T13:11:53.683 回答