新的核心数据实体与现有实体相同:单独的实体或其他解决方案?

Posted

技术标签:

【中文标题】新的核心数据实体与现有实体相同:单独的实体或其他解决方案?【英文标题】:New Core Data entity identical to existing one: separate entity or other solution? 【发布时间】:2010-07-20 19:56:20 【问题描述】:

概述:我正在设计一个餐厅管理应用程序,我有一个名为 Order 的实体,其中包含 Items。由于一家餐厅可以运营多年,完成数千个“订单”,并且为了使我的应用程序的网络端更容易并保持数据库快速,我想介绍 ClosedOrder 的概念,它是一个基本上已经支付了订单。

我有几个选项可以做到这一点:我可以向我的 Order 实体添加一个 isClosed 属性,并使用谓词执行所有“打开”订单的获取请求,但这会导致存在大量记录的问题每次需要提取时都要经过数据库,由于我的应用程序的工作流程,这通常与 Order 实体一起使用。如果我理解正确,创建“ClosedOrder”子实体也会有同样的问题,因为 Core Data 将所有子实体存储在数据库的同一个表中。

在这种情况下创建一个完全独立的实体是愚蠢的吗?或者这正是我需要做的?对于我对数据库性能的整体缺乏了解,我深表歉意,Core Data 很漂亮,因为它抽象出需要学习的知识,但同时它实际上并不能让它变得不重要,尤其是在这样的情况下,性能如果我的用户将其推得太远,可能会严重降级。

【问题讨论】:

【参考方案1】:

如果您使用 SQLite 存储类型并且“isClosed”属性为“Indexed”(实体编辑器面板中的设置),您可能有数十万个订单,并且在过滤时仍然有一个不错、快速的获取时间仅适用于“isClosed == YES”。

创建一个单独的实体并不会真正为您带来太多性能,但它在事情发生变化时使维护变得更加痛苦(例如,两个迁移步骤的价格)。您仍在存储所有这些项目,并且 SQLite 在正确设置时是一个称职的数据库库。在这里使用一个索引属性,然后生成一些测试数据,然后测量性能。我相信你会满意的。

【讨论】:

啊,有趣,您是否有更多关于索引是什么/索引如何为菜鸟工作的信息? :) Core Data 文档中没有任何内容,一周前我在谷歌上搜索它时,大多数人都在问它是什么,并注意到它不在文档中。如果我理解正确找到的那一点,听起来我也应该索引我的 UUID 属性。 1) 选择“isClosed”属性并选中“Indexed”即可。 2) 仅当您有兴趣根据其 UUID 过滤/获取实例时,才应将其编入索引。就个人而言,我会使用数字属性,而不是字符串 UUID(要存储/操作/搜索的文本更少)。 哦,不,我明白该怎么做,只是不明白“幕后”发生了什么。这是我应该在谷歌上搜索的 SQLite 东西吗? 不,在使用 Core Data 时,您将 完全 将 SQLite 的处理留给 Core Data。它所做的是告诉 SQLite 为您选择的任何属性创建一个索引。这有助于 SQLite 更快地找到表行。但是,不要对索引感到高兴,并且索引所有内容,因为过多的索引会对性能产生负面影响。仅索引您用于查找/获取/排序/任何内容的主要属性。一般来说,这是一个关系数据库。

以上是关于新的核心数据实体与现有实体相同:单独的实体或其他解决方案?的主要内容,如果未能解决你的问题,请参考以下文章

如何确保核心数据实体的单一实例

与现有核心数据实体不同

如何创建从一个实体到另一个现有实体的核心数据关系?

核心数据 - 不能存储两个单独的实体

核心数据建议将现有实体置于现有实体中

核心数据:非法尝试建立关系+(空)上下文