【问题标题】:Designing a key-value database设计键值数据库
【发布时间】:2021-03-30 01:22:36
【问题描述】:

我正在尝试设计一个键值数据库。要了解我正在尝试构建一个示例博客应用程序。 我正在根据 id 存储创建的帖子

key : postid
value : post 

现在我需要将 cmets 添加到这些帖子中,我基本上希望能够检索特定帖子的所有 cmets。我可以想到两种方法来做到这一点。

  1. 创建评论 ID

    键:comment_id, 价值:评论

遍历所有 cmets 并在需要的地方返回 postid == comment.postid(comment 会有一个名为 postid 的字段)

  1. 创建 postid_commentid 形式的键。

遍历键,使用分隔符将键分成两部分并匹配类似 key[0]==postid 的内容

  • 哪个效率更高?

  • 哪一个更具可扩展性?我正在设计这个练习 ,最后我可能也想向外扩展。

  • 还有其他我没有想到的方法吗?

【问题讨论】:

  • 您使用什么语言?哪个图书馆?
  • 顺便提个很好的问题。您在第二种解决方案中处于良好的轨道上,但您需要 searchsearch_near 基本上将光标跳转到可以帮助您“扫描”仅相关键的位置。和 SQL 一样,全表扫描也不好。

标签: database-design nosql leveldb


【解决方案1】:

典型的键/值表不只包含两列。

+-----+------------------+------------------+ |关键 |什么 |价值 | +-----+------------------+------------------+ | 1 |发布_内容 |我是超人。 | | 1 | POST_DATE | 2020-12-01 | | 1 | POST_POSTER | X先生 | | 2 |发布_内容 |我累了。 | | 2 | POST_DATE | 2020-12-05 | | 2 | POST_POSTER | X先生 | | 22 | COMMENT_POST_ID | 1 | | 22 |评论内容 |这不是真的。 | | 22 |评论海报 |怀疑先生 | | 22 | COMMENT_DATE | 2020-12-17 | | 23 | COMMENT_POST_ID | 1 | | 23 |评论内容 |哇! | | 23 |评论海报 |路易斯巷 | | 23 | COMMENT_DATE | 2020-12-21 | | 24 | COMMENT_POST_ID | 2 | | 24 |评论内容 |睡得好! | | 24 |评论海报 |睡魔 | | 24 | COMMENT_DATE | 2020-12-21 | +-----+------------------+------------------+

您甚至可以将这四列分成四列,即将what = POST_CONTENT 拆分为entity = POSTattribute = CONTENT,这使得它更具可读性并且可能更易于访问。我会这样做。您甚至可以将这两列称为tablecolumn,因为这毕竟是它们所代表的:-)

无论如何,使用键/值表是一件麻烦事。这可能是一种很好的做法,但在现实生活中您会尽可能避免使用它们。

如果您在 RDBMS 中使用具有适当列的表,则可以保证日期包含日期(而不是例如“2020-02-30”甚至“去年的某天”),即评论必须引用一个帖子,并且只能引用一个现有帖子 ID,并且每个帖子和评论都有内容、数据和海报。使用键/值表,DBMS 无法保证这些。

另一方面,在 NoSQL DBMS 中,帖子通常会完整存储其所有数据和 cmets 列表。没有单独的表格,没有单独的列,而是一张张贴表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多