【问题标题】:How to create table where one column contain names of other tables如何创建一列包含其他表名称的表
【发布时间】:2019-08-24 02:02:14
【问题描述】:

SQL 新手。我的数据由一个主键表和许多其他数据表组成。注意:不同数据表中的 x y 值完全没有直接关系。

key table as below
key1|key2|dataTableName|
-----------------------
1   |0.1 |     a       |
3   |0.9 |     b       |
0   |0.3 |     c       |
... |... |    ...      |

data table a
X | Y | val
-----------
x1| y1| v1
x2| y2| v2
x3| y3| v3
..|...|...

data table b
X | Y | val
-----------
x1| y1| v1
x2| y2| v2
x3| y3| v3
..|...|...

data table c
X | Y | val
-----------
x1| y1| v1
x2| y2| v2
x3| y3| v3
..|...|...

查询将主要基于 key1、key2,然后是所选表的 X、Y 值。 数据量方面,关键表可能包含 200 行,即 200 个数据表。每个数据表本身可以包含数百万行。 最容易做的事情可能是有一个巨大的表,所有数据合并,key1 key2 为每一行 od 数据复制。但考虑到上述数据量,我有点担心效率。 任何建议将不胜感激。

谢谢!

【问题讨论】:

  • 在列中存储表名似乎不是一个好的数据建模设计。
  • 感谢 cmets,我正在寻找一种为此进行数据建模的好方法。接受任何建议。

标签: sql postgresql


【解决方案1】:

拆分数据以便高效访问不同数据的一种方法是使用partitioning

分区是指将逻辑上是一张大表拆分为较小的物理块。分区有几个好处:

  • 在某些情况下,查询性能可以显着提高,尤其是当表中大多数频繁访问的行位于单个分区或少量分区中时。分区替代了索引的前导列,减少了索引大小,并使索引的频繁使用部分更有可能适合内存。

  • 当查询或更新访问单个分区的很大一部分时,可以通过利用该分区的顺序扫描而不是使用分散在整个表中的索引和随机访问读取来提高性能。

【讨论】:

  • 谢谢罗曼。我假设您建议在使用分区时为所有数据使用一张巨大的表?如果我使用 key1 key2 作为分区,SQL 是否仍然为每一行数据物理存储 key1,key2 的副本。在我的真实数据中,我可能有 20-30 个关键列。
  • 键值将存储在数据表和索引中。您可能仍然拥有将key1, key2, ... 映射到您称为dataTableName 的某个唯一值的键表。但它不应是表名,而应该是用于对数据表进行分区的列中的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
  • 2020-05-17
  • 2018-05-05
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 2019-10-01
相关资源
最近更新 更多