将一个 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)
现在,我想尽可能高效地执行两个特定的查询。第一个是:
- 给我所有 object_id,其中 type_id 是
并且 value_id 是
- 给我所有 value_id,其中 type_id 是
上面的架构有一个我知道的问题。我在两个地方存储对 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 = ?
我有一个设置,我在其中将不同类型的文本值分配给某个对象。系统使用三个表,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)
现在,我想尽可能高效地执行两个特定的查询。第一个是:
- 给我所有 object_id,其中 type_id 是
并且 value_id 是 - 给我所有 value_id,其中 type_id 是
上面的架构有一个我知道的问题。我在两个地方存储对 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 是
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 = ?