2012-04-11 54 views
1

我使用xcode和核心数据创建数据模型。这是一个对象图,而不是实体关系模型,所以我有继承和多对多关系。我该如何建模某些实例无法修改?

这是我的问题: 我有一个名为Category的类或实体。某些类别是由应用创建的,不能由用户删除或修改。用户可以创建自己的类别。

经过思考,我找到了4种方法来模拟这个。看到图片:

enter image description here

我想最实际的解决方案只是把一个标志,isSystemCategory,但我不知道什么是从一个造型点的最佳解决方案。我猜第一个。一个称为Category的抽象类和2个后代,可编辑和可删除的UserCategory,以及不可修改的SystemCategory,用户不能删除它或修改。请注意,后代不会添加任何属性,关系或任何更改,所以,这就是我的问题的原因。这对建模者来说是否正确?

我想知道你的想法。谢谢。

回答

1

根据描述我可能会去第一个。

注意,后人不添加任何属性,关系或任何 变化

但行为是不同的。还有一个逻辑上的差异。 User和UserCategory之间有一种暗示的“关系”,允许用户创建/更新/删除UC。你可能不需要明确地保留它,但它仍然存在(并且你可能会捕获它,例如,如果你想记录谁创建/修改/删除了类别)。

创建单独的子类型可以防止一些令人讨厌的条件逻辑,否则如果您使用的话会突然出现。一只旗。想想删除:有一个国旗,你会有一个if (category.isUserCategory) then <delete> else <...etc...>。此外,对于每个对于用户类别和系统类别而言表现不同的操作,该逻辑将被复​​制。使用子类型删除:UserCategory.delete()只是做它,SystemCategory.delete()只是没有(甚至可能没有SystemCategory上的公共删除)。没有条件。

最后一个想法:这里的问题实际上是关于授权。如果处理类别是它唯一出现的地方,那么你的选择(1)可能是一个实用的解决方案(“最简单的事情可能有效”)。但是,如果您反复需要控制访问权限,那么您可能应该使用更一般的授权机制。

hth。

+0

很棒的回复。 “创建单独的子类型将防止一些讨厌的条件逻辑”,这正是我所想的。但是,我想知道是否使用核心数据(第一种情况下的类别是抽象类/实体),我可以发送如下请求:“属于此类别的所有食谱(即,用户或系统类别)”和相反,“属于用户创建的类别的食谱”。我认为是可能的,但不确定。非常感谢。 – Ricardo 2012-04-11 12:29:11

+1

不客气。我不熟悉Core Data。然而,如果你不能要求(a)所有系统类别(系统类别的实例),(b)所有用户类别(用户类别的实例)和(c)所有类别(实例类别)。类别可能是抽象的 - 但在运行时仍然有它的实例(每个{User | System}类别实例同时是一个Category实例)。心连心。 – sfinnie 2012-04-11 20:39:22

相关问题