2014-05-08 56 views
0

可以说我有一个实体A和实体B。关系是1:1。如果我删除A然后B也应该删除。我已经设置了级联删除规则。现在让我们假设我添加另一个实体C,它与1:1到B有关系。核心数据如何纠正设计

我不知道如何正确处理这个问题。如果AC具有相同的B它应该是相同的实例B?或者我应该复制条目?如果它是相同的删除A不能删除B如果C有一个引用它。

此外,我怎样才能强制执行这种1:1关系AB?在我创建实体的那一刻,我也创建了一个实体,不检查它是否已经在数据库中。这不会失败,并导致重复B

编辑:为了更好地理解我想要实现:

一个必须有一个C也必须始终有一个B

例如让我们假设我有一个实体商店(B)和一个实体收藏(A)。在未来,我可能会添加另一个也会使用Shop的实体。因此,如果用户创建收藏夹,他会给它一个名称和一个。现在如果我不检查这个已经在数据库中,我会创建另一个。另一方面,如果我允许重复我可以使用级联删除规则,一定不要害怕,如果我删除一个收藏夹,它会离开另一个收藏一个空的

我感觉有点失落,我不确定这种情况下最佳做法是什么。任何帮助都会增加。

+0

唯一的好答案需要理解数据代表什么以及如何使用它。有重复的** B **有意义吗?也许,也许不是,答案取决于** B **实际代表什么以及它与** C **的关系。 –

+0

编辑了这个问题。我希望现在能更清楚我想实现的目标。 – kukudas

回答

1

这取决于你正在尝试做什么。如果没有A的情况下B不能存在,那么级联仍然适用。但是,如果C可以导致B仍然存在,那么您应该删除级联删除。

但是这也引出了一个问题,如果其中任何一个不存在,其他人是否不存在。这可能意味着如果A被删除,则需要删除B和C.

让我们把这个应用到一个例子中。

A =身体 B =头 C =脑

可以说,这些都是人体需要活着的东西。没有身体,头部和大脑就无法工作。对于其余部分也是如此。所以如果这些部分中的任何一个死亡,其他部分就会死亡好的,现在如果A和C有相同的B,那么这应该是唯一的B,而不是重复的。

CoreData的任何实现都应该在创建新实体之前检查实体的存在,除非您可以保证它只会属于一个特定的实体。如果您不想检查重复项,您的A和B必须始终是唯一的。总是有独特的真实世界价值。具体的时间将是一个总是唯一的例子。这第二个只存在于现在,不会再存在,也不存在过。

如果一个新的A创建一个B,那很好。但是,如果A和C都可以有相同的B,那么你必须检查一个存在的B,否则A和C将永远不能共享一个B.如果你的A永远只有1B,并且没有其他人使用B,那么只要你总是创造独特的A,你就可以做到这一点。

+0

谢谢你的详细解答。在我的情况下,如果我创建一个它必须有一个B.如果我创建一个C它也必须有一个B. A和C没有关系。 – kukudas

+0

好吧,他们确实有关系,如果他们有相同的B,他们通过B相关。无论如何,你应该在这种情况下检查B的重复。 :P祝你好运! – ColdLogic