关系数据库组织

Posted

技术标签:

【中文标题】关系数据库组织【英文标题】:Relational Databases organization 【发布时间】:2015-02-05 13:13:08 【问题描述】:

我正在为一个包含新闻和新闻页面不同主题的网站创建 CMS。所以我为每个主题(体育、文学等)创建了一个表,只是为了有一个更干净、更好的数据库组织(我想)。但是我最近了解了关系数据库,并发现可以使用更少的表(只有 2 个表主题和内容)和更少的代码(这很棒)来完成相同的任务。但我担心的是,由于这个网站可能会随着时间的推移有数百甚至数千页,所以在一张桌子上放这么多页是否安全、干净且可以?知道有一天有人可以入侵该站点并删除该表,我会丢失所有帖子。那么有没有更干净、更安全的方法来完成这个任务,但仍然使用关系数据库的概念呢?

【问题讨论】:

据我所知,您混淆了两个主题。您不应该仅仅因为您担心安全而在良好的设计上妥协。这是两个完全不同的东西。在设计方面,一个不错的数据库引擎,例如 mysql 或 SQL Server 可以在一个表中处理数百万行。您的硬件可能更像是一个限制因素。 如果您担心黑客“删除表”,那么您需要定期备份......但是黑客可以像删除一张表一样轻松删除许多表 @JLo 对此感到抱歉,我应该更改标题吗? 请注意,您可能需要三个表格(主题、内容和 content_topics),如果可以将关于运动员的书籍同时归类为体育和文学 我认为这个问题根本是无效的,你应该问两个单独的问题,并跟进这两个问题。您对这两个主题提出质疑是正确的,并且您在研究关系数据库的正确道路上 - 似乎您已经掌握了基础知识。您质疑安全性也是正确的,但在我看来,您应该独立研究、学习和采取这两件事。 【参考方案1】:

简短的回答:是的。正如 JLo 在上面的评论中所说,在设计数据库结构时,您不应该主要考虑安全性;主要考虑数据存储的效率(即规范化)。

如果黑客可以进入您的数据库,那么无论他们可以访问哪些表,这都是一个问题。所以在安全方面,首先要把精力集中在防止注入和数据库攻击上。尝试将您的数据分成不同的表以防止被黑客入侵,就像将您的黄金存放在十个不同的银行金库中以防止银行抢劫;这是security through obscurity,它在每一步都对你不利。

相反,在安全方面:

如果您的服务器代码已经编写好,请对其进行安全审核。专家可以指出可能会导致不需要的数据库访问的代码片段,并告诉您确切的原因。我想说,你从审计中获得的学习经验比他们提出的实际具体建议更有价值。 Google SQL injection 并尽可能阅读有关该主题的所有内容。 这种技术是大多数数据库黑客攻击的发生方式,而且您必须不仅熟悉它是什么,还有哪些易受攻击的代码看起来像,以及如何编写保护它的代码。 设置出色的冗余数据库备份系统。 至少有 2 个独立的备份系统存储在 2 个不同的地方。如果黑客丢弃了您的一张桌子,那么这将给您带来很大的不便,而不是破坏业务。

就归一化数据结构而言:

将形状相同的数据存储在同一个位置。因此,只要所有页面都可以用表中的相同列来描述/定义,就绝对将它们存储在同一个表中。 了解 Mysql 性能和索引。 索引不佳/结构不佳的数据库可能会在低流量和最大表中的一百万行以下情况下停止运行;一个索引良好的行可以很好地处理 十亿 行。随着您的流量增加,这个问题变得更大,因此希望您的预算相应增加,并允许您在这方面获得专家帮助。性能问题可能会突然出现,因此值得在它们导致您的网站崩溃之前对其进行大量了解。 不要太担心行数。这里主要关心的是性能;往上看。关系数据库是为处理大表而构建的;这是他们的主要用例。使用基本的索引技术(例如,在每个外键列和任何其他通常查询的列上添加索引(但主键列已经被索引,因此它们不需要索引))你应该能够使它达到 1M- 1000 万行,没有重大性能问题。 找到一种方法,将您的查询与真实数据进行基准测试。 一些性能优化是显而易见的,但俗话说,premature optimization is the root of all evil。例如,在编写查询时,请进行一些基准测试,以了解是否具有更少的查询(更长/有更多的 JOIN)或更多的查询(更小更快)是否更高效。作为一个非常普遍的规则,查询越少越好,但在许多情况下您的应用程序会不同意 ;-) 所以有适当的基础设施来自己测试它。添加索引时也是如此;基准测试可以让您对索引对数据库的影响有一个很好的直觉,而这种直觉是非常有价值的东西。

【讨论】:

如果可以的话,我会投票两次。对于刚开始了解设计关系数据库的人来说,这是一个很好的提示。 谢谢 JLo!以我的经验,熟悉 Mysql 的最好方法是手头有一个像 SequelPro 这样的 GUI,这样你就可以玩查询,自己添加索引等等。似乎现在很多项目(尤其是在 Rails 世界中)只能通过控制台、迁移脚本等间接访问数据库;与数据库的距离确实让人更难了解正在发生的事情。 @TopherHunt 非常感谢您的帮助,这很有帮助,我一定会搜索带有 GUI 的数据库管理工具(适用于 linux),看看我是否可以更专注于设计并与数据库有更多的“直接联系”,这样我就可以提高自己的技能。再次感谢您。 @Yuran 如果你的桌面环境是在 Linux 上,看起来 MysqlWorkbench 和 Navicat 有本机产品。我发现 MysqlWorkbench 启动有点慢但非常稳定;我只用它来编写查询,忽略了它的大部分高级功能。我发现 Navicat 有点不稳定和不可靠(有时它会做出我没有要求的更改)并且通常不会推荐它。如果您的桌面是 Windows 或 Mac,但数据库位于 Linux 服务器上,则大多数 Mysql GUI 客户端都可以选择通过 SSH 连接到远程数据库。设置起来可能会很痛苦,但 200% 值得。【参考方案2】:

由于这个网站可能会随着时间的推移有数百甚至数千页,所以在一个表中包含这么多页是否安全、干净且可以?

只要您的索引正确,您就可以在数据库中存储数百万页。

知道有一天有人可以入侵该网站并删除该网站 表,我会丢失所有的帖子。

在这里使用一个或数千个表没有区别,如果您可以删除一个表,则可以将它们全部删除。

【讨论】:

以上是关于关系数据库组织的主要内容,如果未能解决你的问题,请参考以下文章

关系数据库系统

关系数据库

关系数据库基本术语

从关系型数据库到非关系型数据库

关系数据库模型的存储结构采用啥形式

数据库学习笔记——关系模式