将一个 Table 的值镜像到另一个 Table 以便在 SQLite 中快速访问

Mirror Values from one Table in another Table for Quick Access in SQLite

我有一个设置,我在其中将不同类型的文本值分配给某个对象。系统使用三个表,types_table 存储不同类型的值,values_table 存储所有可能类型的所有值,assignments_table 存储类型/值对对引用的某些对象的分配一个id.

架构看起来像这样

CREATE TABLE types_table        (type_id   INTEGER PRIMARY KEY, type_name TEXT)
CREATE TABLE values_table       (value_id  INTEGER PRIMARY KEY, type_id INTEGER FOREIGN KEY, value_name TEXT )
CREATE TABLE assignments_table  (object_id INTEGER FOREIGN KEY, type_id INTEGER FOREIGN KEY, value_id INTEGER FOREIGN KEY)

现在,我想尽可能高效地执行两个特定的查询。第一个是:

上面的架构有一个我知道的问题。我在两个地方存储对 type_id 的引用,一次是赋值的一部分,一次是值的一部分。 type_id 引用/外键的真实位置在 values_table 中。但是,如果 assignments_table 中没有重复项,第一个查询将需要查找两个表。

所以我想知道在SQLite中是否有一种方法可以将存储在values_table中的type_id“镜像”到assignment_table中以便快速访问。也就是说,这些值永远不会不同步,但第一个示例查询不需要查找两个表。

您可以通过 JOIN

实现此目的
CREATE TABLE types_table        (type_id   INTEGER PRIMARY KEY, type_name TEXT)
CREATE TABLE values_table       (value_id  INTEGER PRIMARY KEY, type_id INTEGER FOREIGN KEY, value_name TEXT )
CREATE TABLE assignments_table  (object_id INTEGER FOREIGN KEY, value_id INTEGER FOREIGN KEY)

给我所有 object_id,其中 type_id 是 并且 value_id 是

SELECT object_id
FROM asignmets_table 
LEFT JOIN values_table  using value_id
LEFT JOIN types_table  using type_id
WHERE type_name = ? AND value_name = ?

给我所有 value_id,其中 type_id 是

SELECT value_id
FROM values_table
WHERE type_id = ?

并且您可以为 assignments_table

创建一个视图
CREATE VIEW assignments_view (object_id, type, value) AS
SELECT object_id, type_name, value_name
FROM assignments_tabe
JOIN values_table using values_id
JOIN types_table using type_id

从那个角度看select你可以

SELECT object_id 
FROM assingments_view
WHERE type_name = ? AND value_name = ?