2014-03-14 87 views

回答

14

Q1:the docs没有明确的限制。在实践中,一些操作是O(n)表的数量;预计计划时间会增加,以及诸如自动清理等问题,因为您会遇到数据库中数千或数万个表。第二季度:这取决于查询。一般来说,巨大的工会是一个坏主意。表继承会更好一些,但如果您使用constraint_exclusion将导致计划时间大大增加。

这两个问题都表明您的设计存在潜在的问题。你不应该需要大量的表和巨型联合。

通过在其他答案的评论,你应该真的只是创建几个表。您似乎想要为每个电话号码创建一个表,这是无意义的,并在其上创建每个数字的视图。不要这样做,它会使数据难以辨认,并会使其更难以处理。索引,其中的子句和连接将允许您在逻辑上将其组织成几个表格时更有效地使用数据。我建议学习基本的关系建模。

如果您稍后遇到可扩展性问题,您可以查看partitioning,但您不需要上千个表。

+0

非常感谢。 – Meem

+0

我见过的最大的数据库是JD Edwards(我认为)ERP系统。它在Oracle上运行了大约20,000个表。但这绝对是一个异常。 –

+0

@ MikeSherrill'CatRecall'由于使用了'search_path'来进行穷人分区,因此每个客户都要克隆模式,所以看到更高的表计数并不是很少见。 –

2

从实际意义上说,两者都是没有限制的。

数据库可容纳的表的数量受磁盘系统上的空间限制。但是,拥有超过几千个表的数据库可能更多地表达了对应用程序域的错误分析。工会也是如此:如果你不得不联合多个表,你可能应该看看你的表结构。

这种情况可能发生的一个实际场景是Postgis:有许多具有类似属性的表可以在单个视图中加入(这是Postgis恕我直言的设计中的一个缺陷),但是通常会在应用程序方面(如GIS)。

你能解释一下你的场景,你需要一个需要在一次扫描中查询的大量表格吗?

+0

情景是这样的:我想创建一个数据库,例如称为“呼叫细节记录器”。在这里,我想存储每个被叫号码和塔号码的数字表,这些数字应该以百万为单位。而且我还希望为每个被叫号码分别创建视图以进一步调整问题。 – Meem

+1

因此,如果我理解正确,您想要存储移动电话通话,记录哪个号码称为另一个号码,以及通过哪些塔楼注册这些通话?如果是这样,那么你需要一个单一的塔表,一个表的所有电话号码与呼叫者的名字和其他细节,你有。两个表都有一个主键,然后你创建第三个表,记录主叫方的pkey,接收方的pkey,塔的pkey,通话时间,持续时间等。创建视图非常简单。你认为你需要很多桌子在哪里? – Patrick

+0

@ user3382347是的,这听起来像你需要四五张表,而不是数千。不要为每个数字创建视图,使用SQL函数或简单的where子句。您可能需要按比例[分割您的表格](http://www.postgresql.org/docs/current/static/ddl-partitioning.html),但您不需要(或不需要)成千上万的表格。 –

相关问题