很抱歉,如果我的标题不清楚。我正在建立一个PHP用户网站,用户可以提交帖子。我目前正在使用MySQL数据库来存储用户和帖子。我还想存储每个用户和每个帖子之间的相关值。这就是这个想法:
-----------------
| user1 | user2 |
-------------------------
| post1 | #val | #val |
-------------------------
| post2 | #val | #val |
-------------------------
我希望我可以在MySQL中创建这样的表,但是我不能用预准备语句选择列名,除非我连接到查询中,这显然不是理想的。
I've asked a similar question before并且响应是制作一个三列表,其中每一行代表一个相关性。像这样:
=======================
| user | post | value |
=======================
| usr1 | pst1 | #val |
-----------------------
| usr2 | pst1 | #val |
-----------------------
| usr1 | pst2 | #val |
-----------------------
| usr2 | pst2 | #val |
-----------------------
我不喜欢这个。它存储了大量无关数据,因为它多次存储每个用户的id,每个帖子的id多次。它还需要一些疯狂的行;如果我只有100个帖子和100个用户,那将是10,000行。
我不害怕将另一个数据库添加到我的项目中(或者如果我喜欢的话,完全切换到另一种数据库类型)以适应这种情况。我知道有很多NoSQL数据库,但我没有MySQL以外的任何经验,我不知道哪个数据库适合我的需要。
我在MySQL中这样做的顾虑是否合理?或者MySQL可以处理那么多行?在MySQL中有另一种方法可以提高效率吗?如果没有,我想知道最好的数据库类型是什么。
这似乎是一种非常常见的存储类型,但我认为在MySQL中没有合理的方法。因此,我认为有一种数据库类型非常适合这样做。
答案 0 :(得分:1)
关系存储的基础知识与您使用的数据库无关。 您当然应该避免使用redudant数据库设计。这就是关系数据库的重点......
但现在到了实际问题! : - )
我认为你只是想从你之前收到的答案中寻找替代方案。
=======================
| user | post | value |
=======================
| usr1 | pst1 | #val |
-----------------------
| usr2 | pst1 | #val |
-----------------------
| usr1 | pst2 | #val |
-----------------------
| usr2 | pst2 | #val |
-----------------------
我会创建三个表。一个主表和两个链接表。
主表:主要:
=============================
| user_id | post_id | value |
=============================
| 1 | 1 | #val |
-----------------------------
| 2 | 1 | #val |
-----------------------------
| 1 | 2 | #val |
-----------------------------
| 2 | 3 | #val |
-----------------------------
链接表1: 用户
===============
| id | name |
===============
| 1 | Mark |
---------------
| 2 | Sohpie |
---------------
链接表2: 发布
===========================
| id | post |
===========================
| 1 | How are you? |
---------------------------
| 2 | The nuts are brown |
---------------------------
| 3 | Milk is white |
---------------------------
然后您可以像这样加入以获取数据:
SELECT u.name, p.post, m.val FROM main m
LEFT JOIN ON user u ON (m.user_id = u.user_id)
LEFT JOIN ON post p ON (m.post_id = p.post_id)
结果应该是:
Mark, How are you, #val
Sophie, How are you, #val
Mark, The nuts are brown, #val
Sophie, Milk is white, #val
我不确定你对#val的意思(它是如何计算的?),但我希望这个答案会让你知道如何解决剩下的问题。