SQL Concrete Vs Class Table 一种子类型的继承查询速度
SQL Concrete Vs Class Table Inheritance query speed on one subtype
我在具体和 Class Table 继承之间权衡(见下面的例子)。 Class Table 当然有很多好处,特别是对于我的场景,超级 table 列保证在整个数据集中保持一致。但是我几乎不需要一次查询每个 subclass,而是所有查询一次都在一个 subclass 上(其中至少有 9 个 subclasses ).
因此,我的行数看起来会非常大,查询一个具有较少行的具体 table 是否会更快,即:
(按照下面的例子)
SELECT property_address
FROM policies_property
ORDER BY date_issued DESC;
或者外键关系是否足够快,以至于查找非常大的超级 table 时的任何查询速度差异在 Class Table 继承中都可以忽略不计:
(按照下面的例子)
SELECT property_address
FROM policies_property INNER JOIN policies_super ON policies_property.id = policies_super.id
ORDER BY policies_super.date_issued DESC;
具体继承的示例: 每种类型完全独立的 table,每个类型都重复相同的列 table>
--// Table: policies_motor
+------+---------------------+----------------+
| id | date_issued | vehicle_reg_no |
+------+---------------------+----------------+
| 1 | 2010-08-20 12:00:00 | 01-A-04004 |
| 2 | 2010-08-20 13:00:00 | 02-B-01010 |
| 3 | 2010-08-20 15:00:00 | 03-C-02020 |
+------+---------------------+----------------+
--// Table: policies_property
+------+---------------------+------------------+
| id | date_issued | property_address |
+------+---------------------+------------------+
| 1 | 2010-08-20 14:00:00 | Oxford Street |
+------+---------------------+------------------+
ClassTable继承示例:一个超级class,多个子class。每个 subclass id 引用一个 superclass id.
--// Table: policies_super
+------+---------------------+
| id | date_issued |
+------+---------------------+
| 1 | 2010-08-20 12:00:00 |
| 2 | 2010-08-20 13:00:00 |
| 3 | 2010-08-20 14:00:00 |
| 4 | 2010-08-20 15:00:00 |
+------+---------------------+
--// Table: policies_motor
+------+----------------+
| id | vehicle_reg_no |
+------+----------------+
| 1 | 01-A-04004 |
| 2 | 02-B-01010 |
| 4 | 03-C-02020 |
+------+----------------+
--// Table: policies_property
+------+------------------+
| id | property_address |
+------+------------------+
| 3 | Oxford Street |
+------+------------------+
I have next to no need to query every subclass at once, instead all queries will be on one subclass at a time (of which there are at least 9 subclasses).
对我来说,这听起来是将它们分开的一个令人信服的理由。不要认为 'superclass' 方法是 'better normalized' 或 'more relational' 等。它们只是两种在理论上同样有效的设计选择;选择在实践中最有意义的那个。
我在具体和 Class Table 继承之间权衡(见下面的例子)。 Class Table 当然有很多好处,特别是对于我的场景,超级 table 列保证在整个数据集中保持一致。但是我几乎不需要一次查询每个 subclass,而是所有查询一次都在一个 subclass 上(其中至少有 9 个 subclasses ).
因此,我的行数看起来会非常大,查询一个具有较少行的具体 table 是否会更快,即: (按照下面的例子)
SELECT property_address
FROM policies_property
ORDER BY date_issued DESC;
或者外键关系是否足够快,以至于查找非常大的超级 table 时的任何查询速度差异在 Class Table 继承中都可以忽略不计: (按照下面的例子)
SELECT property_address
FROM policies_property INNER JOIN policies_super ON policies_property.id = policies_super.id
ORDER BY policies_super.date_issued DESC;
具体继承的示例: 每种类型完全独立的 table,每个类型都重复相同的列 table>
--// Table: policies_motor
+------+---------------------+----------------+
| id | date_issued | vehicle_reg_no |
+------+---------------------+----------------+
| 1 | 2010-08-20 12:00:00 | 01-A-04004 |
| 2 | 2010-08-20 13:00:00 | 02-B-01010 |
| 3 | 2010-08-20 15:00:00 | 03-C-02020 |
+------+---------------------+----------------+
--// Table: policies_property
+------+---------------------+------------------+
| id | date_issued | property_address |
+------+---------------------+------------------+
| 1 | 2010-08-20 14:00:00 | Oxford Street |
+------+---------------------+------------------+
ClassTable继承示例:一个超级class,多个子class。每个 subclass id 引用一个 superclass id.
--// Table: policies_super
+------+---------------------+
| id | date_issued |
+------+---------------------+
| 1 | 2010-08-20 12:00:00 |
| 2 | 2010-08-20 13:00:00 |
| 3 | 2010-08-20 14:00:00 |
| 4 | 2010-08-20 15:00:00 |
+------+---------------------+
--// Table: policies_motor
+------+----------------+
| id | vehicle_reg_no |
+------+----------------+
| 1 | 01-A-04004 |
| 2 | 02-B-01010 |
| 4 | 03-C-02020 |
+------+----------------+
--// Table: policies_property
+------+------------------+
| id | property_address |
+------+------------------+
| 3 | Oxford Street |
+------+------------------+
I have next to no need to query every subclass at once, instead all queries will be on one subclass at a time (of which there are at least 9 subclasses).
对我来说,这听起来是将它们分开的一个令人信服的理由。不要认为 'superclass' 方法是 'better normalized' 或 'more relational' 等。它们只是两种在理论上同样有效的设计选择;选择在实践中最有意义的那个。