我是一个拥有200多名用户的成长型公司的四人团队的一员。是时候对我们的专有软件进行大规模重构了,我们非常高兴能够构建一个理想的系统,我们知道它可以承受至少5年以上的增长。然而,我们正在使用关系数据库,虽然我们正在制作一些相当不错的设计,但我有一种迫在眉睫的感觉,即此产品可能会比我们希望未来更慢。
我担心的是我们对外键关系的使用。它们非常适合数据完整性,这就是我们与它们合作的原因。如果我们想要更改某人的用户名,则会在所有相关位置更改它。那很棒。问题是,我们不是 - 我们通过他们的ID相关联,所以唯一的主要好处是通过获得关系密钥索引所获得的性能。
所有这些指数堆积如山,给我一个红旗。我们有一些表只是链接表,有三个关系键。他们肯定有自己的位置,我们非常有信心减少我们将要进行的查询。但是,我接着想 - 我们有10,000行,其中10,000行,另一行10,000,我们想添加一行。巴姆!新指数* 4.
这令人担忧。我们会陷入任何陷阱,经验丰富的个人提出任何建议吗?
答案 0 :(得分:3)
除非必须,否则不要丢弃Fks。如果你这样做,差错数据几乎有100%的可能性。
Fks会减慢插入和删除的速度,但他们应该这样做。如果拥有数万亿财务记录的人可以构建数据库,这些数据库运行速度快,但仍然有限制,那么你就可以了。
如果您担心自己的数据库设计工作量增加,那么请聘请专业的数据库设计师。 SOmeone谁知道消除密钥和非规范化的真正风险以及由数据库设计不良引起的性能问题。
答案 1 :(得分:3)
我担心的是我们对外键关系的使用。他们很棒 数据完整性,这就是我们与他们合作的原因。如果我们想要 更改某人的用户名,它会在所有相关位置更改它。 那很棒。问题是,我们不是 - 我们与他们的ID有关,所以 唯一的主要好处是通过关系获得的表现 密钥的索引。
外键不仅仅是级联更新的等价物。正确使用的外键保证只能在引用它的列中输入有效值。
如果您让用户输入“旧金山,阿拉巴马州”作为城市名称,拥有一个非常快的数据库并不重要。无论你邮寄什么,都不会送货。旧金山不在阿拉巴马州。
您可以发现的每个数据完整性约束都需要声明到dbms。它节省了时间和金钱。很多。
答案 2 :(得分:3)
您当前的系统有多快?设计一个好的数据库模式是整个应用程序的基础,如果我在速度和设计之间做出决定,我会选择设计。有许多方法可以加速您的应用程序,这与数据库本身无关。
如果您进行并行安装(使用新系统运行旧系统),您可以监控慢速查询日志并在早期阶段阻止任何初始缓慢问题。您还可以通过添加新的或编辑现有索引来识别常用查询并优化查询。
您还可以实现一个缓存层,这将大大加快您的应用程序。缓存充当应用程序和数据库之间的一个层,您可以在这里以易变且可快速访问的状态存储常用的信息。
另一种优化技术是扩展(增加单个机器的物理容量)或向外扩展(在复制的群集中添加更多的机器)。我看到系统运行速度非常快,有1000万条记录,在64GB内存的机器上运行。因此,确保您的设计包括物理容量。
您可以遵循一系列优化技术来确保快速的数据库;远离文本列,不要使用OR运算符,从ORDER BY RAND()开始,并限制使用group by
等分组运算符。这些只是一些例子,所以做一些研究。为了使优化更容易,您可以使用MySQL的解释等工具,它将确定在运行应用程序时查询的痛苦程度。
我强烈建议使用Percona's MySQL版本,因为它们经过高度优化并提供自定义功能。
听起来你和你的团队正走在正确的道路上,不要太担心设计一个复杂的系统。某些软件应用程序需要复杂的系统来运行真正的诀窍是使复杂的系统易于使用,以便您可以轻松地支持它并在将来发展它。祝你好运。
答案 3 :(得分:2)