Core Data/SQLite 是不是压缩冗余信息?

Posted

技术标签:

【中文标题】Core Data/SQLite 是不是压缩冗余信息?【英文标题】:Does Core Data/SQLite compress redundant information?Core Data/SQLite 是否压缩冗余信息? 【发布时间】:2013-11-24 22:07:05 【问题描述】:

我想使用 Core Data(可能带有 SQLite 支持)来存储大型数据库。 很多的字符串数据在许多行之间是相同的。 Core Data/SQLite 是否看到这种冗余,并自动节省 db 文件中的空间?

在将它添加到数据库之前,我是否需要确保不同行中的相同文本是相同的字符串object?如果是这样,我如何检测到新文本与现有数据库中的 anywhere 匹配?

【问题讨论】:

【参考方案1】:

不,Core Data 不会尝试分析您的数据以避免重复。如果你想保存 1000 万个具有相同属性的对象,你将得到 1000 万份。

如果您想避免创建重复的实例,您需要在创建新实例之前获取匹配的实例。一般的做法是

    获取与新数据匹配的对象 - 根据任何标准表明您的应用程序存在重复。使用包含您不想复制的属性的 fetch 谓词。 如果您发现任何内容,请 (a) 使用您拥有的任何新值更新您找到的实例,或者 (b) 如果没有新值,则不执行任何操作。 如果您没有找到任何东西,请创建一个新实例。

【讨论】:

这不是整个记录重复或需要更新的问题。此应用程序正在分析来自复杂游戏的保存游戏文件。我的数据库将包含(除其他外)成千上万的人。每个人都有属性,包括名字、出生日期、宗教信仰等。由于游戏的性质,会有很多人共享名字,并且很多人拥有相同的宗教信仰。我希望我需要将宗教文本转换为引用单独宗教表的 ID,但我不确定这是否值得为名字做。 在多个实例中重用字符串的唯一方法是将它们分解为新的实体类型。这对于“宗教”字段可能有意义,但可能不适用于名字字段。 对于它的价值,我预计会有 100,000 到 150,000 个独特的人,共享 14,000 到 15,000 个独特的名字。每个名字平均有 6-10 人,其中几个名字由 100 多人共享。【参考方案2】:

应用层逻辑可以以应用复杂性为代价来帮助减少空间。

假设您的姓名字段可以包含整数或字符串。 (SQLite 的弱类型使得这很容易做到)。

如果是字符串 -- 那就是那里的名字。

如果是整数 -- 在名称表上查找它,使用 int 作为键

当然,您必须创建该名称表,或者在插入数据时即时创建,或者偶尔在数据中搜索值得以这种方式替代的新名称。

【讨论】:

以上是关于Core Data/SQLite 是不是压缩冗余信息?的主要内容,如果未能解决你的问题,请参考以下文章

如何测试 Core Data SQLite 文件是不是已加密?

Core Data (SQLite) 手动迁移是事务性的吗?

sqlcipher与Microsoft.Data.Sqlite.Core踩坑

sqlcipher与Microsoft.Data.Sqlite.Core踩坑

如何 VACUUM 一个 Core Data SQLite 数据库?

由于继承缺陷,Core Data sqlite 存储单表?