数据库设计问题 - 将关系保持在最低限度

时间:2010-08-06 19:26:47

标签: database-design core-data entity-relationship

我有一个足够规范化的数据库设计,但现在我需要添加一个新表(实体,因为我实际上使用的是Core Data),而且我遇到了一些问题。

景观有很多评估 评估有一个评估类型
AssessmentTree有一个评估 AssessmentTree有12个其他实体中的每一个,省略了空间。

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

(我觉得我可能没有很好地解释这种情况,所以如果我能以某种方式澄清,请告诉我。)

我考虑过的可能的解决方案,其中没有一个令人满意:

  1. 从Photo实体中创建对每个其他对象的引用。 Nil引用将意味着Photo不是该集合的一部分。
  2. 创建一个新实体PhotoRelations,它将保存对Photo的引用以及对其附加的对象之一的引用。问题是,虽然我可以轻松地使用SQL系统执行此操作,但我无法想到如何将其转换为CoreData。
  3. 任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

理论上,您将按照使用子类定义的非Core Data对象的方式处理此问题。您将定义一个链接到具体照片实体的抽象父实体。然后,您将需要照片的所有实体从该父实体继承。

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

这是一种痛苦。我一直希望他们能够克制这种限制。

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

答案 2 :(得分:0)

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

linkedIn |照片ID |链接类型

链接类型可以是上面列出的任何整数1-N