2

我有一个 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------

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

方式四:

???

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

4

2 回答 2

8

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

第三版

第三个版本需要有 n 行 xn 列,其中 n 是注册用户的数量。InnoDB 有1000 列的限制,第1001 列就打破了你的逻辑。用户注册。更不用说您不想为每个新用户更改表。忘记那个。

第一个版本

The first solution is really slow: BLOB data won´t be really idexed, it tends to get into a second page (file on harddisk, effectively doubeling disk I/O), it has massive datasize overhead, sorting and grouping won't happen in RAM, and you have no efficient way for backwards search (how many people did blacklist user xy?)... as a general advise, try to avoid BLOB untill absolutely necesarry.

2nd version

The second solution is the way to go. MySQL is optimized for stuff like that, and a table with 2 numeric, indexed rows is really fast.

Table design

I would create a table consisting of blocker_id | blocked_id and no separate primary key. Instead I would create a 2-column-primary-key with blocker beeing the first column and blocked the second. That way you save a B-Tree (expensive to create index) and can search fast for both all blockeds from a blocker (using half of the key) and for the existence of a single combination. (That will be most relevant for filtering posts, and should be optimized for.)

于 2013-05-20T10:20:45.457 回答
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语句获取其他用户的数据。

于 2013-05-20T10:19:54.123 回答