【问题标题】:Maintain a Queue of Strings for each ID in Database为数据库中的每个 ID 维护一个字符串队列
【发布时间】:2015-12-10 11:14:11
【问题描述】:

我有一个 MySQL 表,其中有一个 ID 列。它是一个自增整数,是表的主键。

我需要为表中的每一行维护一个字符串(标签)队列(对于您可以说的每个 ID,因为这是主键)。

例如:- ID = 1 的队列可能是 'hello'、'idontknow'、'bye'

ID = 2 的队列可能是 'idontknow'、'whoareyou'、'bye'

队列的最大长度可以达到 10。

在我的服务器上运行的定期脚本每次都会从队列中删除所有 ID 的成员(字符串)。并将剩余的更新到表中。例如:对于 ID = 1,'hello','idontknow','bye', 'hello' 将被删除,更新后的列值将是 'idontknow','bye'。

所有这一切都在大规模发生。只需单击一下,即可将新成员(字符串)添加到表中所有行的队列中。

管理此问题的最佳方法是什么?我是否应该在我的表中有一个列(队列中的成员的逗号分隔字符串),每次都将一个成员添加到队列(列)中?并在检索时删除成员并更新列中的更新值。

或者我应该在数据库中有单独的表,每个 ID 都有多行。这些行将分别包含队列的成员。在这种情况下,可能会同时发生 10k 次插入。在检索时,可能会同时发生 10k 次删除。

你有什么建议?哪种方式更具可扩展性?

第二种方法的数据库结构:

客户表

身份证、姓名

现在需要为另一个表中的每个客户维护队列。

队列表

ID(此表的主键),CustomerID(来自客户表的外键), String(队列中成员的字符串)

所以我需要通过 CustomerID 从队列表中获取。

【问题讨论】:

    标签: php mysql queue scalability


    【解决方案1】:

    你可以把你的表改成这样:

    id | CusomterID | string
    ---+------------+----------
     1 |          1 | hello
     2 |          1 | idontknow
     3 |          1 | bye
     4 |          2 | something
    

    那么你的整个桌子就是队列。它使读取队列中的下一个作业变得非常简单,并且使更新队列变得非常简单。

    【讨论】:

    • 那么queue_id表示主表中的ID(外键)?
    • 是的,queue_id 的外键是什么?也许queue_id 不是正确的术语。分组对您来说似乎很重要,如果不是,您可以将其关闭(只使用 idstring)。
    • 嗯,基本上你的意思是,对于每个 ID,我将队列成员存储在另一个表的不同行中。并在检索时删除它们?
    • 我不明白你的意思。
    • 我明白你的意思。这是可扩展的吗?我需要在数据库中为 queue_id 建立一个索引,因为检索对时间非常敏感。检索需要非常快。
    猜你喜欢
    • 1970-01-01
    • 2015-01-03
    • 2010-12-22
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2013-05-12
    • 1970-01-01
    相关资源
    最近更新 更多