9

假设我有一个Citizen表(列:rowidname)和一个Race表(列:rowidname)。这些是世界公民,种族是“高加索人”、“非洲裔美国人”等。rowids 是 SQLite 提供的默认列。

有数十亿公民。比赛很少,比如说50。

将每个公民与其种族联系起来的 SQLite 方式是什么?

在标准的编程语言中,我会简单地为每个种族附加一个包含所有相应citizenrowid的集合。这将允许我做各种事情:

  • 给定一个种族,快速找到它的所有成员。
  • 给定一个公民,快速遍历种族(因为种族很少)并查看集合并找到他或她的种族。
  • 添加公民很简单。我只是把新的rowid放入他或她的比赛中。
  • 同样,删除一个公民也很简单。

我怎样才能在 SQLite 中做到这一点?鉴于 SQLite 只有 B-tree 索引,这会很棘手吗?也许这种数据一开始就不属于 SQLite 数据库?

4

1 回答 1

16

SQLite 支持FOREIGN KEYS,因此您应该按如下方式对表进行建模。

Race 表中的 RaceId 是 Citizen 表中的 FOREIGN KEY,如果 1 个 Citizen 在您的应用程序用例中只能有 1 个 Major Race。

CREATE TABLE Race
(
  RowId INTEGER AUTO_INCREMENT PRIMARY KEY, 
  RaceName   TEXT
);

CREATE TABLE Citizen 
(
  RowId BIGINT AUTO_INCREMENT PRIMARY KEY, 
  CitizenName  TEXT,
  RaceId INTEGER,
  FOREIGN KEY(RaceId) REFERENCES Race(RowId)
);    

如果你想支持多种族(现在很可能),然后从 Citizen 表中删除 FOREIGN KEY 并创建一个名为CitizenRace的新 MANY-2-MANY 表,它将具有 CitizenIds 和 RaceIds 如下所示。

CREATE TABLE Race
(
  RowId INTEGER AUTO_INCREMENT PRIMARY KEY, 
  RaceName   TEXT
);

CREATE TABLE Citizen 
(
  RowId BIGINT AUTO_INCREMENT PRIMARY KEY, 
  CitizenName  TEXT
);    

CREATE TABLE CitizenRace
(
      CitizenId BIGINT,
      RaceId INTEGER,
      FOREIGN KEY(CitizenId) REFERENCES Citizen(RowId),
      FOREIGN KEY(RaceId) REFERENCES Race(RowId)
);
于 2013-11-05T23:55:14.260 回答