我有一个PHP应用程序,我需要存储黑名单数据。我的网站成员将向其黑名单中添加任何用户。所以他们看不到用户的短信。
每个用户的黑名单都不一样。
用户黑名单中可以有1000-1500个用户。
用户可以从列表中添加/删除任何人。
黑名单将有成员的身份证和黑名单上的人的身份证。
我正在尝试为此设计数据库表。但我不能确定结构是怎样的?
我有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时,操作似乎有点慢。
方式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:
???
这些是我的想法。我真的很感激你能给我一个更好的吗?
谢谢您。

最佳答案

您正在创建的是所谓的1到n关系表。
第三版
第三个版本需要n行x n列,其中n是注册用户的数量。InnoDB有一个limit of 1000 columns,一旦1001.用户注册,就会中断您的逻辑。更不用说,您不想为每个新用户更改表。算了吧。
第一版
第一个解决方案非常缓慢:BLOB数据不会真正被识别,它往往进入第二个页面(硬盘上的文件,有效地屏蔽磁盘I/O),它有大量的数据量开销,排序和分组不会在RAM中发生,而且你没有有效的方法进行反向搜索(黑名单用户xy有多少人?)... 一般来说,在万不得已的情况下,尽量避免呕吐。
第二版
第二个解决办法是走这条路。MySQL是为类似的东西而优化的,一个有两个数字索引行的表非常快。
表格设计
我会创建一个表
阻止程序id
没有单独的主键。相反,我会创建一个2列主键,blocker在第一列,blocker在第二列。这样一来,你就可以保存一个B-树(创建索引很昂贵),并且可以从一个拦截器(使用一半的密钥)和单个组合的存在中快速搜索所有的块。(这将是最相关的过滤职位,并应优化。)

关于php - 黑名单的MySQL数据库表设计,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16647192/

10-10 00:10