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

tra*_*nte 2 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)---------
Run Code Online (Sandbox Code Playgroud)

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

方式2:

--member ID----black listed ID--------
--------------------------------------
--1234---------113434545--------------
--1234---------444445454--------------
--1234---------676767676--------------
--6789---------534543545--------------
--6789---------353453454--------------
Run Code Online (Sandbox Code Playgroud)

这样,当用户想要查看他/她的黑名单时,我在"黑名单ID"列中为他们提供所有用户.编辑时我向表中添加/删除新行.这个操作很快,但表格可以很大.

方式3:

--member ID----113434545----444445454----676767676---534543545-----353453454
----------------------------------------------------------------------------
--1234--------yes------------yes------------yes------------no------no-------
--6789--------no-------------no-------------no-------------yes------yes------
Run Code Online (Sandbox Code Playgroud)

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

方式4:

???

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

Zso*_*gyi 8

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

第3版

第3版需要有n行xn列,其中n是注册用户的数量.InnoDB的有1000列的限制,打破你的逻辑,只要1001个.用户注册.更不用说你不想为每个新用户使用ALTER TABLE.算了.

第一版

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

第二版

第二个解决方案是要走的路.MySQL针对这样的东西进行了优化,并且具有2个数字索引行的表非常快.

表设计

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

  • 我只是偶然发现了这个答案,并想指出InnoDB的限制为1000*列*,而不是1000*行*.在这方面,您可能想要更正此答案. (2认同)