用于黑名单的MySQL数据库表设计

时间:2013-05-20 10:11:59

标签: php mysql database-design

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

每个用户的黑名单都不同 用户可以在他/她的黑名单中拥有1000-1500个用户 用户可以在他/她的列表中添加/删除任何人 黑名单将包含会员ID和黑名单人员ID。

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

方式1:

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

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

方式2:

--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------

是显示黑名单,没有显示黑名单。我为每个黑名单人员创建新列,并在用户添加或删除该列时更新​​该列。

方式4:

???

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

2 个答案:

答案 0 :(得分:8)

您正在创建的是所谓的 1到n关系表

第3版

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

第一版

第一个解决方案非常慢:BLOB数据不会真正被识别,它往往会进入第二页(硬盘上的文件,有效地加倍磁盘I / O),它有大量的数据量开销,排序和分组赢了发生在内存中,你没有有效的方法进行向后搜索(有多少人将用户xy列入黑名单?)......作为一般建议,尽量避免使用BLOB,直到绝对必要。

第二版

第二种解决方案是要走的路。 MySQL针对这样的东西进行了优化,一个包含2个数字索引行的表格真的快。

表格设计

我会创建一个包含的表     blocker_id | blocked_id 并没有单独的主键。相反,我会创建一个2列主键,其中阻塞器位于第一列并阻挡第二列。通过这种方式,您可以保存B树(创建索引的成本很高),并且可以快速搜索来自阻止程序的所有块(使用键的一半)以及单个组合的存在。 (这对于过滤帖子最相关,应该进行优化。)

答案 1 :(得分:4)

我认为你应该像黑客名单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语句在所有列上设置索引并获取其他用户的数据。