关系数据库组织
Relational Databases organization
我正在为一个网站创建 CMS,该网站将包含新闻和新闻页面的不同主题。所以我为每个主题(体育、文学等)创建了一个 table,只是为了拥有一个更清晰、更好的数据库组织(我认为)。但我最近了解了关系数据库,发现可以用更少的 tables(仅 2 tables 主题和内容)和因此更少的代码(这很棒)来完成相同的任务。但我担心的是,随着时间的推移,这个网站可能会有成百上千个页面,那么将这么多页面合并到一个 table 中是否安全、干净且可以?知道有一天有人可以侵入该站点并删除 table,我会丢失所有帖子。那么有没有更干净安全的方法来实现这个任务,但仍然使用关系数据库的概念?
since this website may with time have hundreds or maybe thousands of pages, is it safe, clean, and ok to have so many pages in one table?
只要您的索引正确,您就可以在数据库中存储数百万页。
Knowing that someday someone could hack into the site and DROP that
table, and I would loose all the posts.
使用一个或数千个 table 在这里没有区别,如果你可以放弃一个 table 你可以放弃它们。
简短回答:是的。正如 JLo 在上面的评论中所说,在设计数据库结构时,您不应该主要考虑安全性;主要考虑数据存储的效率(即规范化)。
如果黑客可以进入您的数据库,那么无论他们可以访问什么 table,这都是一个问题。所以在安全方面,把精力放在第一时间防止注入和数据库攻击上。试图将您的数据分离到不同的 table 中以保护它免受黑客攻击,就像将您的黄金存储在十个不同的银行金库中以防止银行抢劫一样;它是 security through obscurity,它对你不利。
相反,在安全方面:
- 如果您的服务器代码已经编写,请对其进行安全审计。 专家可以为您指出可能对不需要的数据库访问产生影响的代码片段,并准确地告诉您为什么。我想说你从审计中获得的学习经验甚至比他们提出的实际具体建议更有价值。
- Google SQL injection 并尽可能阅读有关该主题的所有内容。 这种技术是大多数数据库黑客攻击发生的方式,它至关重要您非常熟悉它是什么、易受攻击的代码是什么样子以及如何编写代码来防范它。
- 建立优秀的冗余数据库备份系统。至少2个独立的存储在2个不同的地方。如果黑客删除了您的 table 之一,那么这将成为一个重大的不便,而不是业务破坏者。
在规范化数据结构方面:
- 在同一个地方存储相同形状的数据。所以只要所有Pages都可以根据table中的相同列来描述/定义,绝对将它们存储在相同的 table.
- 了解 Mysql 性能和索引。 索引不当/结构不当的数据库可能会在低流量和最大的一百万行以下陷入停顿 tables;一个索引良好的索引可以很好地处理 billions 行。随着流量的增加,这个问题变得越来越严重,因此希望您的预算相应增加,并让您获得专家的帮助。性能问题可能会突然出现,因此值得在它们使您的网站崩溃之前充分了解它们。
- 不要太担心行数。这里主要关注的是性能;看上面。建立关系数据库是为了处理大 table;这是他们的主要用例。使用基本的索引技术(例如,在每个外键列和任何其他经常查询的列上添加索引(但主键列已经编入索引,因此它们不需要一个))你应该能够达到 1M- 1000 万行,没有重大性能问题。
- 找到一种方法来根据真实数据对您的查询进行基准测试。 一些性能优化是显而易见的,但俗话说,premature optimization is the root of all evil。例如,在编写您的查询时,进行一些基准测试,以了解更少的查询(更长/有更多的 JOIN)或更多的查询(更小和更快)是否性能更好。作为一个非常普遍的规则,查询越少越好,但在许多情况下您的应用程序会不同意 ;-) 因此要有适当的基础设施来自己测试它。添加索引时也是一样;基准测试可以让您对索引对数据库的影响有一个很好的直觉,而这种直觉是非常有价值的。
我正在为一个网站创建 CMS,该网站将包含新闻和新闻页面的不同主题。所以我为每个主题(体育、文学等)创建了一个 table,只是为了拥有一个更清晰、更好的数据库组织(我认为)。但我最近了解了关系数据库,发现可以用更少的 tables(仅 2 tables 主题和内容)和因此更少的代码(这很棒)来完成相同的任务。但我担心的是,随着时间的推移,这个网站可能会有成百上千个页面,那么将这么多页面合并到一个 table 中是否安全、干净且可以?知道有一天有人可以侵入该站点并删除 table,我会丢失所有帖子。那么有没有更干净安全的方法来实现这个任务,但仍然使用关系数据库的概念?
since this website may with time have hundreds or maybe thousands of pages, is it safe, clean, and ok to have so many pages in one table?
只要您的索引正确,您就可以在数据库中存储数百万页。
Knowing that someday someone could hack into the site and DROP that table, and I would loose all the posts.
使用一个或数千个 table 在这里没有区别,如果你可以放弃一个 table 你可以放弃它们。
简短回答:是的。正如 JLo 在上面的评论中所说,在设计数据库结构时,您不应该主要考虑安全性;主要考虑数据存储的效率(即规范化)。
如果黑客可以进入您的数据库,那么无论他们可以访问什么 table,这都是一个问题。所以在安全方面,把精力放在第一时间防止注入和数据库攻击上。试图将您的数据分离到不同的 table 中以保护它免受黑客攻击,就像将您的黄金存储在十个不同的银行金库中以防止银行抢劫一样;它是 security through obscurity,它对你不利。
相反,在安全方面:
- 如果您的服务器代码已经编写,请对其进行安全审计。 专家可以为您指出可能对不需要的数据库访问产生影响的代码片段,并准确地告诉您为什么。我想说你从审计中获得的学习经验甚至比他们提出的实际具体建议更有价值。
- Google SQL injection 并尽可能阅读有关该主题的所有内容。 这种技术是大多数数据库黑客攻击发生的方式,它至关重要您非常熟悉它是什么、易受攻击的代码是什么样子以及如何编写代码来防范它。
- 建立优秀的冗余数据库备份系统。至少2个独立的存储在2个不同的地方。如果黑客删除了您的 table 之一,那么这将成为一个重大的不便,而不是业务破坏者。
在规范化数据结构方面:
- 在同一个地方存储相同形状的数据。所以只要所有Pages都可以根据table中的相同列来描述/定义,绝对将它们存储在相同的 table.
- 了解 Mysql 性能和索引。 索引不当/结构不当的数据库可能会在低流量和最大的一百万行以下陷入停顿 tables;一个索引良好的索引可以很好地处理 billions 行。随着流量的增加,这个问题变得越来越严重,因此希望您的预算相应增加,并让您获得专家的帮助。性能问题可能会突然出现,因此值得在它们使您的网站崩溃之前充分了解它们。
- 不要太担心行数。这里主要关注的是性能;看上面。建立关系数据库是为了处理大 table;这是他们的主要用例。使用基本的索引技术(例如,在每个外键列和任何其他经常查询的列上添加索引(但主键列已经编入索引,因此它们不需要一个))你应该能够达到 1M- 1000 万行,没有重大性能问题。
- 找到一种方法来根据真实数据对您的查询进行基准测试。 一些性能优化是显而易见的,但俗话说,premature optimization is the root of all evil。例如,在编写您的查询时,进行一些基准测试,以了解更少的查询(更长/有更多的 JOIN)或更多的查询(更小和更快)是否性能更好。作为一个非常普遍的规则,查询越少越好,但在许多情况下您的应用程序会不同意 ;-) 因此要有适当的基础设施来自己测试它。添加索引时也是一样;基准测试可以让您对索引对数据库的影响有一个很好的直觉,而这种直觉是非常有价值的。