将字段拆分为多个表会产生更快的查询吗?请考虑以下两种情况:
Table1
-----------
int PersonID
text Value1
float Value2
或
Table1
-----------
int PersonID
text Value1
Table2
-----------
int PersonID
float Value2
如果Value1和Value2总是一起显示,我想第一个场景总是更快,因为第二个架构需要两个SELECT语句。
但是你有没有选择第二种情况?如果预计记录数量真的很大?
答案 0 :(得分:0)
这称为Vertical partitioning,在某些特定情况下,可能会产生更好的性能。
来自Wikipedia:
即使已经规范化,垂直分区也超出了规范化和分区列。也可以使用不同的物理存储来实现垂直分区;例如,在不同设备上存储不常使用或非常宽的列是一种垂直分区的方法。
垂直分区的一种常见形式是从表中快速查找(快速查找)静态数据中拆分(慢速查找)动态数据,其中动态数据的使用频率与静态数据不同。
在两个新创建的表中创建视图会恢复原始表,但会降低性能,但访问静态数据时性能会提高,例如:用于统计分析。
您可能有兴趣查看以下文章,了解MySpace如何,何时以及使用垂直分区来解决其可缩放问题的时间:
答案 1 :(得分:0)
考虑您的架构1:有2个表。如果您只使用personID和Value2插入大量数据(最终将为value1插入null),那么它将是次优的。在这种情况下,Schema2会更好。 (想想学校的学术部门/学生上面提到的例子,每个学生都有一个与他有关系的部门。哪一个更好?Schema1?Schema 2)
如果value1和value2都在一起(比如说SSN,FirstName,LastName)Schema1(一个表)是理想的
一般的经验法则是你会将非规范化模式(table1)用于readonly /或大部分只读表和schema2(2个表)用于只写/大部分写入(或者写入次数超过读取次数非常大)价值)表
答案 2 :(得分:0)
如果文本定期是一个非常大的文档,甚至有些时候它不需要访问其他两列,我会将它们分开。对于非常少量的行,您将看不到太多差异。尝试数百万行,扫描表所需的工作量变得非常不同。数据规范化的任何规则都不会导致您将它们拆分。 http://www.bkent.net/Doc/simple5.htm是一个非常好的参考。像许多问题一样,答案取决于细节。如果所有这些问题都有一个简单的答案,DBMS可以做到,你甚至不必考虑它。
答案 3 :(得分:0)