我正在考虑在密钥值数据库中分片数据库的策略。我已经阅读了很多用于分片的文档和文章但没有在哪里解释了当我们使用复合分片键时我们如何读取数据。我有几个与键值数据库中的分片算法有关的问题。
1)使用复合键最好在Key-Value noSQL数据库中使用进行分片?根据我的观点,我可以说这不是一个好主意,因为我们不知道客户端想要在我的键值数据库系统中存储什么类型的数据集。 如果我错了,请分享您的想法。
2)假设第一个答案是肯定的,那么在查询数据时如何读取数据?假设我使用复合分片键来存储数据,那么在仅基于一个字段查询数据时如何读取数据。
示例:
{
log_type: <string>, // one of "warn", "notice", "error"
application: <string>,
message: <string>,
created_on: <integer> // timestamp when created
}
假设我在这里使用了复合键(message+logtype+application)
,那么读写操作在技术上是如何工作的。这是我的主要问题。
有人可以用我的例子向我解释这个问题。
任何帮助都将不胜感激。
答案 0 :(得分:1)
你混合了太多的术语和技术。首先,您需要选择适合您的持久存储技术(如果我需要选择您在问题中标记的NoSQL之一,通常 Mongo )。
Mongo不是键值存储,而是面向文档的存储(文档基本上是序列化对象),其分片基于索引属性。详细了解如何配置sharding in Mongo on its official docs。
另一方面,Redis是一个纯键值存储,其中值可以是数据结构,如列表,哈希和集合(和其他,它只是一个摘要)。在Redis中,分片是基于使用大括号标记键:mysql> create table test(field1 int);
mysql> insert into test values (1);
mysql> select * from test where field1 in ();
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1
。标记为my:{key}:whatever
的任何键都将存在于同一个分片中。了解有关Redis中的分片的更多信息on its official docs。
无论如何,当你问NoSQL世界中是否使用复合键是一个好主意时,我认为你需要花时间了解NoSQL方法与关系数据库的不同之处。您不应该以这种方式考虑您的解决方案,并且您也不能将NoSQL视为通用方法,因为每个NoSQL数据库的工作方式不同,您选择的NoSQL技术将要求您仔细考虑模型您的数据是否正确。
NoSQL只是它不是关系。