假设我有一个Citizen
表(列:rowid
、name
)和一个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/