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

标签 sql database sqlite

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

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

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

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

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

我如何在 SQLite 中执行此操作?鉴于 SQLite 只有 B 树索引,这会不会很棘手?也许这种数据一开始就不属于 SQLite 数据库?

最佳答案

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

Race 表中的 RaceId 是 Citizen 表中的外键,如果 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 表,这将具有如下所示的 CitizenId 和 RaceId。

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)
);

关于sql - 在 SQLite 关系数据库中对此进行建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19799535/

相关文章:

android - 使用带有 WithoutRowID 的主键

php - 如何通过 PHP 处理 SELECT 1 的结果?

postgresql - 数据库分区的最佳大小

php - 尝试通过 HTML 和 php 将数据插入 Mysql 数据库时出错

android - 如何替换 SQLite 数据库

ios - 如何从 sqlite 文件生成 objective-c 类

mysql - 选择最短和最长的字符串

mysql - 将查询的一个结果除以另一个查询的结果

mysql - 从mysql中选择随机记录

database - 一个日志表与每个表上的日志列