我正在尝试使用mysql实现一个键/值存储
我有一个包含2列的用户表,一列用于全局ID,另一列用于序列化数据。
现在的问题是,每当用户数据的任何位发生变化时,我都必须从数据库中检索序列化数据,更改数据,然后将其重新序列化并将其重新放入数据库。即使对用户的任何数据进行非常小的更改,我也必须重复这些步骤(因为无法在数据库本身内更新该单元格)
基本上我正在研究人们在面对这个问题时通常使用的解决方案?
答案 0 :(得分:1)
答案 1 :(得分:0)
当这是一个问题时,人们不使用键/值存储,他们设计一个规范化的关系数据库模式,将数据存储在可以更新的单独的单值列中。
答案 2 :(得分:0)
说实话,您的解决方案是使用数据库作为美化文件系统 - 我不建议将这种方法用于应用程序的核心应用程序数据。
在我看来,使用关系数据库的最佳方法是存储关系数据 - 表,列,主键和外键,数据类型。在某些情况下,这不起作用 - 例如,如果您的数据确实是文档,或者事先不知道数据结构。对于这些情况,您可以扩展关系模型,也可以迁移到文档或对象数据库。
在您的情况下,我首先会看到序列化数据是否可以建模为关系数据,以及您是否需要数据库。如果是这样,请转到关系模型。如果您需要数据库但无法将数据建模为关系集,则可以转到键/值模型,在此模型中将序列化数据提取到单个键/值对中;这至少意味着您可以更新/添加单个数据字段,而不是修改整个文档。键/值并不适合RDBMS,但它可能比您当前的架构更小。
答案 3 :(得分:0)
当你有一个键/值存储时,假设你的序列化数据是JSON,它只有当你有memcached时才有效,因为你不是每次都动态更新数据库而是更新memcache &安培;然后在后台将其推送到您的数据库。因此,您必须更新整个值,但不要更新JSON数据中的单个字段,例如数据库中的地址。你可以更新&从memcached快速检索数据。因为在数据库中没有复杂的关系,所以推送和推送是快速的。将数据从数据库提取到内存缓存。
答案 4 :(得分:0)
我将继续您的工作,并为可索引数据创建单独的表。这样,您就可以将数据库视为单个数据存储,可以通过大多数操作组(包括更新,备份,还原,群集等)轻松地对其进行管理。
如果您需要执行类似like
查询之类的操作以提高搜索性能,那么您唯一需要考虑的就是添加ElasticSearch。
如果空间对您来说不是问题,我什至将其设置为仅插入数据库,因此所有更改都会添加一条新记录,从而您可以保留历史记录。当然,您可能希望删除较旧的记录,但是您可以有一个后台作业,该作业将在后台批量删除被取代的记录。 (请记住,我所说的基本上是卡夫卡)
在性能方面,现在有许多替代方法可以胜过RDBMS。但是,它们又增加了额外的运营开销,因为它是另一个需要维护的中间件。
如果您具有微服务架构,则解决方法是将中间件保留在微服务堆栈中。但是,您必须处理跨微服务传输的数据,因此最终还是要切换到所有这些服务之下。