关系上的谓词Vs谓词属性哪个最好?

时间:2016-08-09 13:35:49

标签: ios core-data relationship nspredicate

可能已经有人在某处回答,但我并不觉得很抱歉这么愚蠢的问题

有两个实体父母和孩子

image with relationships

我想要父母的所有孩子然后我将使用像下面的谓词

这样的关系
[NSPredicate predicateWithFormat:@"parent = %@", parent]

image with attributes

  

我将parent_id存储在子表中作为属性

并使用谓词

 [NSPredicate predicateWithFormat:@"parent_id = %@", parentid]

现在我的问题是哪个给击球手表现以及如何? 因为我很困惑为什么我使用关系模型,因为我可以找到属性

2 个答案:

答案 0 :(得分:2)

这两个版本都使它变得比它需要的复杂得多。如果在名为Parent的变量中有parent的实例,则可以通过直接查找关系的值来获取每个相关的child,而无需执行获取或使用谓词任何一种。

NSSet *children = [parent valueForKey:@"child"];

或者,如果您创建了NSManagedObject的子类来表示Parent的实例,

NSSet *children = parent.child;

[顺便说一下,将child引用重命名为children之类的内容可能是一个好主意,因为这是一种多对多的关系。]

在你的例子中,第一个是...不太不合适,我会说。它仍然比它需要的更复杂,但Core Data提供关系相关实体的确切目的。像第二个示例中那样存储外键是将SQL风格的思想错误地应用于非SQL API。

答案 1 :(得分:1)

我不完全确定CoreData如何在内部工作,但我强烈认为关系更好。我想通过使用它们你基本上遵循指针,而使用谓词导致搜索某个实体的实例。

显然CoreData做了一些像关系数据库(使用sqlite作为默认存储等等),但由于教程告诉你使用关系来做你想做的事情,我很确定它依赖于某种方式进行优化。对于某些需要与数据模型“并行”的定义连接的情况,谓词更适合特定搜索或“解决方法”。