伪造核心数据中的动态模式?

时间:2010-03-16 03:16:29

标签: objective-c cocoa core-data dynamic-schema

通过阅读关于核心数据的Apple Docs,我了解到在需要动态架构时不应使用Core Data。如果我想让用户能够创建自己的属性,那么在核心数据模型中如果我创建了一些“虚拟”属性,如“自定义小数1”,“自定义小数2”,“自定义文本1”, “自定义文本2”等用户可以为自己的目的命名和使用?

显然这对于​​人际关系不起作用,但对于简单的属性来说,这似乎是一种合理的解决方法。在大多数用户未使用的实体上创建一堆虚拟属性会显着降低它们的性能吗?有没有人尝试过这样的事情?谢谢!

3 个答案:

答案 0 :(得分:2)

首先,请参阅核心数据文档on relationships。使用您的示例,请考虑以下内容:

  1. CarAttributeType实体,名称为“weight in pounds”
  2. CarAttribute实体,其值为2765。
  3. Car实体,具有您提到的所需值(例如“color”,“make”等)
  4. 然后,CarAttribute和CarAttributeType之间存在多对一关系(许多CarAttributes可以具有相同的类型),Car和CarAttribute之间的一对多关系(每辆车可以有许多属性)。此解决方案的设置比硬编码的NULL字段更复杂。但是,它避免了repeating groups,并且希望更易于维护。

    编辑:是的,我错过了。我想你会想要一个StringCarAttribute,StringCarAttributeType,FloatCarAttribute,FloatCarAttributeType等。然后,在StringCarAttribute和StringCarAttributeType之间有多对一等.Car将有一对一的同时具有StringCarAttribute和FloatCarAttribute。多个类型实体的原因是你没有StringCarAttribute和FloatCarAttribute,它们都声明自己使用单个权重属性类型。

    拥有一个包含所有类型的CarAttribute会违反1NF#4。

答案 1 :(得分:1)

一个选项是KSExtensibleManagedObject。推送可扩展属性中的动态模式位。

答案 2 :(得分:0)

它会起作用,它会很糟糕。想想在数据库中使用平面表,因为这正是您正在做的事情。而是尝试创建一个可以以应用程序可以理解的方式描述模式的模式。然而,仍然会涉及相当多的代码,但如果正确完成,您可以模仿SQL数据库。当然,核心数据建立在SQL(或其他存储类型之上,但这不是我的观点)之上,但基本上你要创建一个模仿两层下层的层,这只是愚蠢的。