来自 SQL 的核心数据建模
Core Data Modelling from SQL
我即将开始第一次使用 Core Data,我试图确保我的数据模型是体面的,然后再深入了解它并意识到它不是。我在 SQL 方面经验丰富,并假设(似乎是错误的)Core Data 是 SQLite 的另一个名称。我读到过,新手在 Core Data 项目中的一大失败是他们试图将 RBMS 概念应用到 Core Data 中,而这不一定是最好的方法。我模拟了一个我想在这个测试项目中使用的 SQL 模式。但是不确定应该如何更改它以更适合核心数据?因此,如果有人可以为我的场景提供一些建议,那就太好了
忘记持久性(将其放在磁盘上)。您将如何仅在内存数据结构中对其进行建模?这通常与您在 Core Data 中建模的方式非常接近。 Core Data 是一个对象图持久化引擎。如果你的对象图足够小以适合内存,原则上你根本不需要 Core Data一个).
Core Data 中存在一些差异,例如每个关系都需要逆向关系(因此如果 Player 有团队关系,那么 Team 应该有球员关系)。但基本上,按照您为对象建模的方式对其建模,因为它们就是这样。
所以我不完全理解你的一些模型,但是一个通用的 "players are on teams and teams have games and games are in a season," 我会按照这些思路想象一个(简化的)模型:
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 中创建中间体的神奇事物。它们只是 "to many" 关系,其中逆关系也是 "to many." 不需要键或任何其他关系。一切都只是对象。大多数情况下,这就是您对 Core Data 的看法。
(我以一种希望有意义的形式写了这个,即使它在 Xcode 7.3 中不是绝对合法的。关系的类型将是无类型的 NSSet
。这就是全部在 Xcode 8 和 iOS 10 中得到了显着改进,你得到了强类型,但我还没有做足够的工作来确定这是否是语法。)
我即将开始第一次使用 Core Data,我试图确保我的数据模型是体面的,然后再深入了解它并意识到它不是。我在 SQL 方面经验丰富,并假设(似乎是错误的)Core Data 是 SQLite 的另一个名称。我读到过,新手在 Core Data 项目中的一大失败是他们试图将 RBMS 概念应用到 Core Data 中,而这不一定是最好的方法。我模拟了一个我想在这个测试项目中使用的 SQL 模式。但是不确定应该如何更改它以更适合核心数据?因此,如果有人可以为我的场景提供一些建议,那就太好了
忘记持久性(将其放在磁盘上)。您将如何仅在内存数据结构中对其进行建模?这通常与您在 Core Data 中建模的方式非常接近。 Core Data 是一个对象图持久化引擎。如果你的对象图足够小以适合内存,原则上你根本不需要 Core Data一个).
Core Data 中存在一些差异,例如每个关系都需要逆向关系(因此如果 Player 有团队关系,那么 Team 应该有球员关系)。但基本上,按照您为对象建模的方式对其建模,因为它们就是这样。
所以我不完全理解你的一些模型,但是一个通用的 "players are on teams and teams have games and games are in a season," 我会按照这些思路想象一个(简化的)模型:
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 中创建中间体的神奇事物。它们只是 "to many" 关系,其中逆关系也是 "to many." 不需要键或任何其他关系。一切都只是对象。大多数情况下,这就是您对 Core Data 的看法。
(我以一种希望有意义的形式写了这个,即使它在 Xcode 7.3 中不是绝对合法的。关系的类型将是无类型的 NSSet
。这就是全部在 Xcode 8 和 iOS 10 中得到了显着改进,你得到了强类型,但我还没有做足够的工作来确定这是否是语法。)