2015-11-05 116 views
0

SQL表每个月我从需要被存储在数据库中的外部公司,含有高达一百万条记录的每个文件发送的文件。主要数据字段是月份,年份,邮政编码和交易类型。创建的年份和月份

我建议我们应该将数据保存在数据库中作为每个月的新SQL表,这样我们就知道每个表中只有有限的数据量。然而,我的一个同事说,他曾经被告知每月创建一张新桌子是不好的做法,但他不知道为什么。

如果我有多个表格,最多只能有60个表格,但可能会少得多(低至12),具体取决于我的客户需要查看的过去的距离。这意味着每个月我都需要删除一个月的数据。

但是,当我做我的SQL查询时,我将只需要从每个查询单个表中的单行数据。从理论上讲,我认为这会比填充数百万行的单个表更有效率。

我想知道是否有人有任何明确的理由,为什么以这种方式分解数据将是一件坏事?

+0

如果只有一个表,运行select查询就简单多了。 –

+0

这个问题可能很快就会被重复关闭。如果来自副本的答案(如http://stackoverflow.com/a/21283725/3854195)没有完全解决您的问题,请编辑它以包括为什么并标记为重新打开。谢谢! – Morpheus

回答

2

所有的“喜欢”的物品应存放在一起,原因如下数据库:仅通过改变WHERE条款

  • 你应该能够提供使用单个SELECT语句中的项的任何子集的声明。使用单独的表格,您必须编写代码将请求分解为计算表名称和过滤该表格的部分。你将不得不在每个应用程序中复制该逻辑,或者教给每个想要使用数据库的用户。

  • 您不应该人为地限制数据的使用。如果您有单独的每月表格,则您已经大大限制了您可以针对它们输入的查询类型,而无需编写更复杂的UNION查询。

  • 增加了一个已知的数据类型数据库的多个实例不应要求ALTER荷兰国际集团数据库的结构,作为一般原则,定期运行的代码甚至不应该有ALTER权限

  • 如果维护了合适的索引,那么当来自表格60倍于较小表格大小的数据时,性能差异非常小。 (对INSERTUPDATE命令可能会有更多的影响,但听起来好像您将进行批量更新而不是不断更新数据)。

我能想到的只有两个原因分片数据转换成独立的表:

  • 你发现你有一个性能问题无法通过更好的数据设计来解决。

  • 您拥有不同安全级别的记录,并且依赖GRANT SELECT权限允许某些用户在更高级别的安全级别上查看记录。

+0

实际上会有权限组,但它们是在邮政编码上指定的。这应该成为数据库表格设计的一个因素吗? – RyuAkamatsu

+0

取决于您需要的安全级别和您的应用程序的性质。绝对安全性只能通过根据安全级别划分数据,然后适当授予访问权限来保证。 [您可以创建'VIEW'来隐藏数据和'GRANT';我不知道这是否在MySQL中可用]。否则,您将依赖于应用程序级逻辑来隐藏用户的数据。 –

0

一个更简单的方法是将一列添加到该表中,该表包含加载到系统中的日期时间戳。您可以通过perticular列过滤器的方法来分离数据到月/年,这是在装。

另一个优点从性能的角度来看,如果你经常过滤数据这样,您可以创建基于索引在这个日期栏。

出于性能原因和信息如何存储在SQL中,建议不要使用包含相同信息的多个表。最终它会占用更多的空间,如果一个月的数据需要引用另一个月的数据,它将会非常缓慢。

希望这会有所帮助。

0

如果你觉得这是不是你很难管理你的应用程序,你可以做到这一点。

例子。你需要每个月更改SQL查询吗? 如果用户需要更多需要数据超过1个月的报告,会发生什么?

使用partitioning,DBMS会将您的数据拆分为物理存储上的多个表,但您可以用相同的名称调用它们中的所有表。 DBMS将使用分区进行分析。性能没有显着差异。