我有一个足够规范化的数据库设计,但现在我需要添加一个新表(实体,因为我实际上使用的是Core Data),而且我遇到了一些问题。
景观有很多评估
评估有一个评估类型
AssessmentTree有一个评估
AssessmentTree有12个其他实体中的每一个,省略了空间。
现在,我正在添加一个Photo实体,它可以与上述任何实体相关联。我需要建立某种关系,以便我只能获取与AssessmentTree相关的照片,例如,或者可能是评估,这将是与AssessmentTree相关的照片的超集。
(我觉得我可能没有很好地解释这种情况,所以如果我能以某种方式澄清,请告诉我。)
我考虑过的可能的解决方案,其中没有一个令人满意:
任何帮助将不胜感激!
答案 0 :(得分:2)
由于Photo
是一个孩子,我会选择你的第一个选项并创建一个指向每个实体的链接。
但是,您计划在Photo中存储什么?如果它只是二进制数据,那么我会重新考虑它并将filePath存储到磁盘上的映像。在Core Data中存储二进制数据并不理想。然后,如果你只是存储文件路径,你可以完全跳过实体,只需将filePath存储在父对象中。
答案 1 :(得分:2)
Core Data旨在解决此问题的方式是通过实体继承。
理论上,您将按照使用子类定义的非Core Data对象的方式处理此问题。您将定义一个链接到具体照片实体的抽象父实体。然后,您将需要照片的所有实体从该父实体继承。
但是,由于SQL存储的实现细节,任何图形中父实体的所有子实体最终都在磁盘上的同一SQL表中。这会降低获取性能,因为即使您刚刚获取一个实体,也必须搜索存储在表中的所有子实体的所有实例。
这是一种痛苦。我一直希望他们能够克制这种限制。
您可以使用测试数据测试实体继承,并查看您的特定实现是否存在问题。如果你只有几千个子实体可以获取简单的属性(字符串,数字,日期等),那么你可以使用实体继承而不会有任何重大的性能损失。
答案 2 :(得分:0)
你可以做的是创建一个像这样的关系表:
linkedIn |照片ID |链接类型
链接类型可以是上面列出的任何整数1-N