对于一个项目,我被要求查看现有的SQL数据库,并查看是否可以对其进行改进。基本上,这是一个客户数据库,每个客户都有大量不同类型的数据。这是(基本上)它的组织方式:
每个客户在客户表中都有一个带有客户ID的行。然后,对于每种数据类型,每个客户都有自己的表。因此,例如,将没有一个“工作”的中央表,每行都有一个客户ID,但是对于每个客户,将有一个名为“jobs1234”的工作表(1234是一个客户ID)。
现在,我的第一 react 是关于为什么要这样组织的困惑。我一直都知道,如果不真正思考超出这一点,进行标准化总是更好。但是,当我与人们讨论时,一些人指出这可能是出于性能原因。他们说,如果“工作”的行太多,那么将它们按客户分开要比将它们全部放在一个表中更好。
关于索引和客户ID是标识符的一些信息。我很困惑为什么这种方法可以提高性能,但到目前为止还没有得到一个非常明确的答案。谁能向我解释为什么会这样,如果在某些情况下这种方法更好甚至是真的?
最佳答案
我觉得这句话令人震惊:
数据库被设计为具有很多行的表-数百万行应该没问题。您没有指定数据量是多少,但是使用jobs
这样的名称,如果总数据量总计超过几百万行,我会感到惊讶。对于此数据量,具有适当索引的单个表应该很好。
在某些情况下,按客户拆分数据很有意义。最有力的情况是它是一个明确的要求,通常是出于安全原因。换句话说,向客户保证“他们的数据绝不会与其他人的数据混合”。而且,在大多数数据库(包括MySQL)中,在表级别比在行级别更容易处理安全性。
另一个可能的原因是表格的格式不同,从而为每个客户反射(reflect)了不同的数据。在这种情况下,您实际上将处理单独的应用程序,并且每个客户都应该拥有自己的数据库。
将每个客户的客户数据分为多个表是否有不利影响?是的。这里有一些:
分区是实现类似功能的一种方法。但是,当查询负载一次集中在一个客户上时,这将是最好的方法。如果所有客户都在同一时间访问数据,那么分区将不会那么成功,而索引应该足够了。
除非有确凿的理由将数据分成单独的表(要求,每个客户端的繁琐安全性或每个客户端的自定义格式),否则您根本不会采用这种方法。即使有这样做的理由,通常也可以使用其他解决方案(例如分区)来解决相同的问题。
关于mysql - SQL数据库: normalization vs.性能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17900645/