【问题标题】:Faking a dynamic schema in Core Data?在 Core Data 中伪造动态模式?
【发布时间】:2010-03-16 03:16:29
【问题描述】:

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

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

【问题讨论】:

  • 您能解释一下您如何设想这些虚拟属性在实践中的应用吗?
  • 当然,假设您的模型中有一个汽车实体,并且您可能有一些属性,例如颜色、品牌、型号、年份。但是您可能会创建一些虚拟属性,以便用户可以重命名您的“自定义整数 1”属性以用于重量,因为使用您的应用程序的特定经销商可能需要跟踪重量以计算运输成本或我无法预料的事情.该软件的其他用户可能会使用“自定义整数 1”作为他们的库存控制编号或其他类似的东西。

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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 如何输入 CarAttributes?我需要一个 StringCarAttribute 实体和一个 FloatCarAttribute 实体吗?还是我应该只创建一个具有 floatValue、boolValue、stringValue 等属性集的 CarAttribute 实体,然后让用户选择适当的类型并仅使用该值,而将其余部分保留为 NULL?您的解决方案将允许无限数量的似乎更合适的属性。我想我没有考虑过使用一般意义上的关系。谢谢。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 感谢您的回复。我最关心的是适应我的用户可能拥有的独特用途。我打算构建用户可能需要的尽可能多的标准/通用属性,但我也希望允许用户添加他们自己的一些额外属性(因为我不可能包含/预期每次使用他们可能有的情况)。
    猜你喜欢
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多