2010-08-06 55 views
1

我有一个数据库设计已足够标准化,但现在我需要添加一个新表(实体,因为我实际上使用核心数据),而且我遇到了一些的问题。数据库设计问题 - 保持关系至少

景观有许多评估
评估具有一个AssessmentType
AssessmentTree具有一个评估
AssessmentTree具有彼此12个实体中的一个,省略了空间。

现在,我添加一个Photo实体,它可以与任何上述实体关联。我需要建立某种关系,例如我可以只抓取与AssessmentTree相关的照片,或者可能是评估,这将是与评估树相关的照片的超集。

(我觉得我可能不会做了伟大的工作,说明情况,所以让我知道如果我能以某种方式澄清。)

可能的解决方案,我认为,其中没有一个是令人满意的:

  1. 从Photo实体内创建对的每隔一个对象的引用。那么无参考文献就意味着照片不是该集合的一部分。
  2. 创建一个新的实体PhotoRelations,该实体将持有对照片的引用和对其所附对象之一的引用。问题是,虽然我可以很容易地用SQL系统做到这一点,但我想不出如何将它转换成CoreData。

任何帮助将不胜感激!

回答

2

Core Data旨在处理此问题的方式是通过实体继承。

理论上,您可以像使用子类定义的非核心数据对象一样处理这种情况。您将定义一个链接到具体照片实体的抽象父实体。那么你会让所有需要照片的实体继承该父实体。

但是,由于SQL存储的实现细节,任何图中父实体的所有子实体最终都在磁盘上的同一个SQL表中。这可能会降低获取性能,因为即使只是获取一个实体,也必须搜索存储在表中的所有子实体的所有实例。

这是一种痛苦。我一直希望他们能够将这个限制折射出来。

您可以使用测试数据测试实体继承,并查看您的特定实现是否存在问题。如果您只有几千个可以获取简单属性(字符串,数字,日期等)的子实体,那么您可以使用实体继承而不会有任何显着的性能影响。

+0

我已经实现了这一点,它大部分都是我需要的,但我希望能够为每个实体关联多张照片,这对于此方法来说似乎很难。建议? – 2010-08-09 16:10:39

+0

将父母中的照片关系更改为多人。这可以让您将任意数量的照片与子实体的每个实例相关联。 – TechZen 2010-08-09 19:44:48

+0

工作很好,谢谢。 – 2010-08-09 20:14:36

0

你可以做的是创建一个像这样的关系表:

linkedId | photoId |链接类型

链接类型可以是任何上述所列为整数1-N

+0

这似乎与我的第二个想法不同,并且需要为每个其他实体添加一个id字段,以及一组额外的代码来跟踪所述id。 – 2010-08-06 19:35:24

2

由于Photo是个孩子,我会去你的第一个选项,并创建一个链接到每个实体。

但是,您计划在Photo中存储什么?如果它只是二进制数据,那么我会重新考虑它,并将filePath存储到磁盘上的映像中。在Core Data中存储二进制数据并不理想。然后,如果您只是简单地存储文件路径,则可以完全跳过实体并将filePath存储在父对象中。