在数据库中存储相关值的最理想方式(与php兼容)是什么?

时间:2013-05-05 04:57:16

标签: php mysql

很抱歉,如果我的标题不清楚。我正在建立一个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中没有合理的方法。因此,我认为有一种数据库类型非常适合这样做。

1 个答案:

答案 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的意思(它是如何计算的?),但我希望这个答案会让你知道如何解决剩下的问题。