在SQLite关系数据库中对此进行建模

lwo*_*ood 8 sql database sqlite

假设我有一个Citizen表(列:rowid,name)和一个Race表(列:rowid,name).这些是世界公民,比赛是"高加索人","非洲裔美国人"等rowid.s是SQLite提供的默认列.

有数十亿的公民.比赛很少,比如50.

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

在标准的编程语言中,我只需在每个种族上附上一个包含所有相应公民rowid的集合.这将允许我做各种事情:

  • 鉴于比赛,快速找到所有成员.
  • 给一个公民,快速循环比赛(因为几乎没有比赛)并查看集合并找到他或她的种族.
  • 添加公民很简单.我只是将新手rowid放入他或她的比赛中.
  • 同样,删除公民很简单.

我怎么能在SQLite中做到这一点?鉴于SQLite只有B树索引,这可能会很棘手吗?也许这类数据不属于SQLite数据库开头?

Shi*_*iva 14

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

Race表中的RaceId是Citizen表中的FOREIGN KEY,如果1 Citizen在您的应用程序用例中只能有1个主要竞赛.

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)
);    
Run Code Online (Sandbox Code Playgroud)

如果你想支持多种族(这些天很有可能),那么从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)
);
Run Code Online (Sandbox Code Playgroud)

  • 我的 2 美分。Race table 应该在 Citizen 之前创建(第一个例子)。将 AUTOINCREMENT 添加到主键定义可确保新种族和新公民将具有唯一标识符。 (2认同)