我将用户 ID 值存储在由 | 分隔的表字段中 (user_id1|user_id2|user_id3|user_id17)。
用户 ID 将在某些时候从该字段中添加和删除。
如何检查当前用户 ID 是否存在于字段中或不使用查询?它当然需要完全匹配。无法查找user_id1
和查找user_id17
。
我知道我可以使用 SELECT 查询,分解字段,然后使用,in_array
但如果有办法使用查询来做到这一点,那就更好了。
为尚未阅读该主题的用户(这是一个坏主意)存储您的论坛值是不可扩展的。如果您真的必须这样做,请以相反的方式进行,因为您还会遇到与在新用户注册时必须向数据库中的每个主题添加条目相关的问题。
而不是前面的关系表,而是尝试如下执行:1
Table: topics
+----+-------+------+-----
| id | title | body | ...
+----+-------+------+-----
| 1 | xyz | .... | ...
Table: replies
+----+-------+------+-----
| id | title | body | ...
+----+-------+------+-----
| 3 | xyz | .... | ...
Table: read_topics
+---------+----------+
| user_id | topic_id |
+---------+----------+
| 2 | 1 |
当您拥有大量用户时,您的方法虽然可能(并且更容易想象)开始崩溃,而可扩展性就是您在评论中提到的。这里的另一个问题是,使用您的方法,您会受到巨大的性能损失,因为您必须从数据库中提取数据,拆分它,然后进行操作和重新组合,然后再进行另一个事务。您还遇到了两个 CGI 线程同时写入表的问题。玩得开心...
您正在使用一种工具来进行数据操作、排序、数据关系和存储,因此请将其用于所有这些,而不仅仅是作为信息的垃圾场。
1. 我远不是数据库优化方面的完整专家,而且很可能有比这更好的方法。测试!
以这种方式存储 id 是个坏主意。更好的策略是将此列重构为另一个表,并在该表中为每个 user_id 存储一行。
在任何情况下,如果您可以通过始终以“|”开始和结束内容来稍微改变在列中存储 user_ids 的方式,
例如,改变这个:
(user_id1|user_id2|user_id3|user_id17)
到
(|user_id1|user_id2|user_id3|user_id17|)
然后您的查询变得简单
SELECT * FROM dbname.tablename WHERE userid_csv LIKE "%|user_id1|%"
请注意,这可能非常低效,并可能导致表格扫描。
听起来您正在寻找 MySQL 等效的Postgres 数组。它值得一票,因为这是解决您描述的问题的合理方法。不幸的是,在 MySQL 支持数组类型数据之前,您可能不得不求助于您所描述的 hinky string-to-array 过程。我会对其他人在 MySQL 中设置数组类型值和关系的解决方案进行一些研究。我还会尝试使用您期望的数据类型对海量数据集进行一些测试,看看这是否真的是一种优化,或者如果使用交叉表使用更标准的解决方案会更好。
在没有看到您的数据的情况下想到的另一个想法是创建一个包含主题 ID 和用户 ID 的交集表,但仅在读取主题时插入一行。然后,您可以假设用户/主题缺少一行表示“未读”。