SQL数据库列中的数组 - 或 - 一个键/值noSQL存储?

时间:2013-07-25 03:54:35

标签: mysql database performance nosql scalability

我提前感谢你的时间。您的经验分享非常宝贵。

假设有4个用户可以提交帖子并提升其他帖子的情况。在数据库中,从上述方法来看,查询执行时间最好吗?它是3列SQL 数据库或2列NoSQL键/值存储?

查询示例:获取post_3的upvoters。

谢谢

第一种方法(例如MySQL)

first approach

第二种方法

second approac

编辑(仅基于John Tseng的回答)

create table post (post_id int, author_id int); create table upvote (user_id int, post_id int).

我应该得出结论:

2个表(= 3个读取)比从php处理的一个表读取长字符串要好吗?

我想要注意在实施项目之前优化速度(或至少学习如何) 是我觉得重要的事情。我不希望我的桌子在未来成为TB并且表现缓慢,因为重新设计将是有风险的并且需要大量工作。我害怕将一个大柱子从一张桌子移到另一张桌子上。 这就是为什么我花了很多时间为我的数据库找到最好的设计,并从一开始就询问是否使用键/值存储是好的。我是否错过理解键值存储,是否在第一台机器上没有使用它们。

The way you store your data is very important, and you should make it logical before optimizing for speed.

为什么不创建一个易于针对未来速度进行优化的逻辑设计?

从你宝贵的答案中我需要了解的是,SQL数据库的良好设计是唯一需要和使用Key-Value存储后会很容易的。

1 个答案:

答案 0 :(得分:2)

如果您要求查询此查询的查询执行时间,那么它肯定是只需要一次读取的模式(第一种方法)。

但是,我不认为这是存储数据的好方法。如果有一天,您想要查询:用户3是否支持用户1的任何帖子?

我会制作两张桌子:

创建表格帖子(post_id int,author_id int); create table upvote(user_id int,post_id int);

这会使你的示例查询变慢,但我认为你不应该优化速度。存储数据的方式非常重要,您应该在优化速度之前使其成为逻辑。您将拥有大量的方法来使您的数据库更快,而不会以奇怪的方式存储您的数据。

当你每秒达到数千个请求时,你会想要做一些非规范化和NoSQL,但我认为你应该远离初始设计中的那些东西。

当人们说NoSQL不能扩展时,它们意味着数据库按TB的顺序排列,请求数量级为每秒数千。在几年内,它们将意味着数十TB,每秒一万次请求。已经可以使关系数据库使用非常强大的机器来处理数十TB和每秒一万个请求。几年后它会更实惠。

总之,在关系数据库中进行初始设计,规范化所有教科书风格。当你开始最大化RAM(在其他关系数据库优化之后),那么你可以考虑这些问题。

修改

对于这一个查询,确实从表中读取一行更快。但是,良好的数据库设计应该足够灵活,以容纳多个查询,而不仅仅是一个。在你的情况下,一旦你有成千上万的追随者甚至数百万的赞成者,你将遇到一些严重的问题。要修改单个upvote,您需要进行大量处理。要查找任何单个更新,您需要解析整个字符串。

虽然我理解您一开始就希望优化速度,但许多人的经验表明,拥有逻辑代码比纯粹以性能指标为中心的代码要好得多。正如我们在这个简短的例子中看到的那样,因为你加快了这个查询的速度,所以你正在大大减慢其他查询的速度。

此外,理解SQL结构要比NoSQL结构容易得多。在学习NoSQL方法之前,你一定要学习SQL方法。一个原因是NoSQL是 SQL的任何东西,而且有很多选择。

返回此特定查询。使用正确的索引,查询将发出三次连续读取,这将与单次读取具有非常相似的性能。我认为加快此查询的正确方法不是以笨拙的方式将数据存储在数据库中,而是将尴尬的存储留给缓存层。您将在数据库中查询查询的正确答案,然后将其存储在缓存中。每次后续读取都将从缓存中获取数据。缓存将被非规范化,如:

key: Post_3_upvotes value: [1, 3]

这与将所有数据存储在键/值存储中的区别在于,将对关系数据库进行修改,这将对修改有所帮助。使用多个并发用户修改键/值存储将使您遇到比性能更大的问题。