swift - SQL 的核心数据建模

标签 swift core-data data-modeling

我即将开始第一次使用 Core Data,我试图确保我的数据模型是体面的,然后再深入了解它并意识到它不是。我在 SQL 方面经验丰富,并假设(似乎是错误的)Core Data 是不同名称的 SQLite。我读到过,新手在 Core Data 项目中的一大失败是他们试图将 RBMS 概念应用到 Core Data 中,而这不一定是最好的方法。我模拟了一个我想在这个测试项目中使用的小 SQL 模式。但是不确定应该如何更改它以更适合核心数据?因此,如果有人可以为我的场景提供一些建议,那就太好了

enter image description here

最佳答案

忘掉持久性(把它放在磁盘上)。您将如何仅在内存数据结构中对其进行建模?这通常与您在 Core Data 中建模的方式非常接近。 Core Data 是一个对象图持久化引擎。如果你的对象图足够小以适合内存,原则上你根本不需要 Core Data一个)。

Core Data 中存在一些差异,例如每个关系都需要逆向关系(因此如果 Player 具有团队关系,那么 Team 应该具有玩家关系)。但基本上,按照您为对象建模的方式对其建模,因为它们就是这样。

所以我不完全理解你的一些模型,但是一个通用的“球员在团队中,团队有比赛,比赛在一个赛季中,”我想像这样一个(简化的)模型:

class Player: NSManagedObject {
    @NSManaged var name: String
    @NSManaged var team: Team?  // 0..1 relationship
}

class Team: NSManagedObject {
    @NSManaged var name: String
    @NSManaged var players: Set<Player> // 0..*
    @NSManaged var homeGames: Set<Game> // Inverse for homeTeam (See more below)
    @NSManaged var awayGames: Set<Game> // Inverse for awayTeam

    // There are more powerful and efficient ways to do this, but a simple convenience example
    var games: Set<Game> { return homeGames + awayGames }
}

class Game: NSManagedObject {
    @NSManaged var homeTeam: Team
    @NSManaged var awayTeam: Team
    @NSManaged var season: Season
    @NSManaged var date: NSDate
}

class Season: NSManagedObject {
    @NSManaged var name: String
    @NSManaged var games: Set<Game> // Note again the inverse relationship
}

我将其设置为 homeTeam/awayTeam,以便轻松强制执行两个团队。但您也可以这样做:

class Team: NSManagedObject {
    @NSManaged var name: String
    @NSManaged var players: Set<Player> // 0..*
    @NSManaged var games: Set<Game> // Many to many relationship
}

class Game: NSManagedObject {
    @NSManaged var teams: Set<Team> // Many to many relationship
    @NSManaged var season: Season
    @NSManaged var date: NSDate
}

多对多关系并不是您必须在 Core Data 中创建中间体的神奇事物。它们只是“对多”关系,反之亦然“对多”。不需要 key 或任何东西。一切都只是对象。大多数情况下,这就是您对 Core Data 的看法。

(我以一种希望有意义的形式编写了它,即使它在 Xcode 7.3 中不是绝对合法的。关系的类型将是一个无类型的 NSSet。这一切都在Xcode 8 和 iOS 10 以及强类型,但我还没有做足够的工作来确定这是否是语法。)

关于swift - SQL 的核心数据建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38850337/

相关文章:

swift - Swift 中等效的 SQL IN 子句

java - 如何注释 Hibernate 实体以同时支持 Java 和数据模型?

ios - 如何在 Swift 的搜索栏中制作动画?

swift - 如何在 SwiftUI 中添加自定义容器 View

ios - BLE 设备 - 相同的代码和相同的固件适用于 iphone SE,但在 iphone 7 plus 中效果不佳

ios - Core Data 第一次没有保存

ios - NSPredicate 和 CoreData 关键编码合规问题

swift - 模式匹配否定

java - 在 Hybris 电子商务上创建产品数据模型

ios - 同一实体的核心数据多个实例 - 共享属性的实体