【问题标题】:MySQL database table design for black lists针对黑名单的 MySQL 数据库表设计
【发布时间】:2013-05-20 10:11:58
【问题描述】:

我有一个 PHP 应用程序,我需要存储黑名单数据。我的网站成员会将任何用户添加到他/她的黑名单中。所以他们不会看到该用户的文本。

每个用户的黑名单都不一样。
一个用户的黑名单中可以有 1000-1500 个用户。
用户可以从他/她的列表中添加/删除任何人。
黑名单将有成员的ID和黑名单的人的ID。

我正在尝试为此设计数据库表。但我不确定结构如何?
我有 7-8 个 MySQL 表,但没有一个是这样的。

方式一:

--member ID-----black listed people (BLOB)
-----------------------------------------
--1234----------(Some BLOB data)---------
--6789----------(Some BLOB data)---------

我可以序列化列入黑名单的人的 ID 并将它们保存在 BLOB 数据列中。当用户想要编辑他/她的列表时,我从表中获取 BLOB 数据,删除不需要的 ID 并使用新数据更新列。当用户拥有 1k-2k 个 ID 时,IT 操作似乎有点慢。

方式二:

--member ID----black listed ID--------
--------------------------------------
--1234---------113434545--------------
--1234---------444445454--------------
--1234---------676767676--------------
--6789---------534543545--------------
--6789---------353453454--------------

这样,当用户想要查看他/她的黑名单时,我会在“黑名单 ID”列中为他们提供所有用户。编辑时,我向表中添加/删除新行。此操作速度很快,但表在时间上可能很大。

方式3:

--member ID----113434545----444445454----676767676---534543545-----353453454
----------------------------------------------------------------------------
--1234--------yes------------yes------------yes------------no------no-------
--6789--------no-------------no-------------no-------------yes------yes------

是表示黑名单,否表示未列入黑名单。我为每个列入黑名单的人员创建新列,并在用户添加或删除人员时更新该列。

方式四:

???

这些是我的想法。如果你能给我一个更好的,我真的很感激? 谢谢。

【问题讨论】:

  • 方式2。更适合搜索,更具代表性。
  • 正如 Corrupt 所说,方式 2 是更好的设计。
  • 同上,这很简单
  • 我更新了我对表格结构建议的回答。
  • 请不要忘记投票并接受对您有帮助的答案,以帮助有类似问题的人访问该网站。

标签: php mysql database-design


【解决方案1】:

您正在创建的是一个所谓的1对n关系表

第三版

第 3 版需要 n 行 x n 列,其中 n 是注册用户的数量。 InnoDB 有一个limit of 1000 columns打破你的逻辑尽快 1001。用户注册。更不用说您不想为每个新用户更改表。算了。

第一版

第一个解决方案真的很慢:BLOB 数据不会被真正索引,它往往会进入第二页(硬盘上的文件,有效地使磁盘 I/O 翻倍),它有大量的数据大小开销,排序和分组获胜'不会发生在 RAM 中,并且您没有有效的方法来向后搜索(有多少人将用户 xy 列入黑名单?)...作为一般建议,在绝对必要之前尽量避免使用 BLOB。 p>

第二版

第二种解决方案是要走的路。 MySQL 已针对此类内容进行了优化,具有 2 个数字索引行的表真的很快。

餐桌设计

我将创建一个包含以下内容的表格 blocker_id |阻塞ID 并且没有单独的主键。相反,我会创建一个 2-column-primary-key,其中阻止器蜂鸣第一列并阻止第二列。这样你就可以保存一个 B-Tree(创建索引很昂贵),并且可以快速搜索来自阻塞器的所有阻塞(使用一半的键)和单个组合的存在。 (这将与过滤帖子最相关,应该针对它进行优化。)

【讨论】:

  • 我只是偶然发现了这个答案,并想指出 InnoDB 的限制为 1000 ,而不是 1000 。您可能希望在这方面更正此答案。
【解决方案2】:

我认为你应该像方式2一样制作黑名单:

black_list_id | blocker | blocked

因此,当您想获取用户阻止的人时,您可以通过SELECT * FROM black_list_table WHERE blocker = :user_id 获取。

要知道谁在阻止用户,您可以得到SELECT SELECT * FROM black_list_table WHERE blocked = :user_id

您可以轻松获取用户屏蔽了多少人,用户有多少屏蔽了用户,此外,您可以使用JOIN语句在所有列上设置索引并获取其他用户的数据。

【讨论】:

    猜你喜欢
    • 2013-09-25
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多