2

通过阅读有关 Core Data 的 Apple Docs,我了解到当您需要动态模式时不应使用 Core Data。如果我想为用户提供创建自己的属性的能力,在核心数据模型中,如果我创建一些“虚拟”属性,如“自定义十进制 1”、“自定义十进制 2”、“自定义文本 1”,它会起作用吗?用户可以为自己的目的命名和使用的“自定义文本 2”等?

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

4

3 回答 3

2

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

  1. 一个 CarAttributeType 实体,其名称如“以磅为单位的重量”
  2. 具有诸如 2765 之类的值的 CarAttribute 实体。
  3. 一个 Car 实体,具有您提到的所需值(例如“颜色”、“品牌”等)

然后,CarAttribute 和 CarAttributeType 之间是多对一的关系(许多 CarAttributes 可以有相同的类型),Car 和 CarAttribute 之间是一对多的关系(每辆车可以有许多属性)。此解决方案的设置比硬编码的 NULL 字段要复杂一些。但是,它避免了重复组,并且希望更易于维护。

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

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

于 2010-03-16T04:23:59.230 回答
1

一种选择是KSExtensibleManagedObject。在可扩展属性中插入动态模式位。

于 2010-03-16T10:58:47.170 回答
0

它会起作用,它会很糟糕。考虑在数据库中使用平面表,因为这正是您要做的。而是尝试创建一个模式,该模式可以以您的应用程序可以理解的方式描述模式。然而,仍然会涉及大量代码,尽管如果做得正确,您可以像 SQL 数据库一样模仿。当然,核心数据是建立在 SQL 之上(或其他存储类型,但这不是我的意思),但基本上你会创建一个层来模仿两层以下的东西,这很愚蠢。

于 2010-03-16T03:28:36.580 回答