-2

对不起,如果我的标题不清楚。我正在使用 PHP 制作一个网站,用户可以在其中提交帖子。我目前正在使用 MySQL 数据库来存储用户和帖子。我还想存储每个用户和每个帖子之间的相关值。这是这样的想法:

        -----------------
        | user1 | user2 |
-------------------------
| post1 | #val  | #val  |
-------------------------
| post2 | #val  | #val  |
-------------------------

我希望我可以在 MySQL 中创建一个这样的表,但是我不能使用准备好的语句选择列名,除非我连接到一个查询中,这显然不理想。

我之前问过一个类似的问题,回答是制作一个三列表,其中每一行代表一个相关性。像这样:

=======================
| 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 中执行此操作的合理方法;因此我想那里有一种数据库类型非常适合这样做。

4

1 回答 1

2

关系存储的基础是相同的,与您使用的数据库无关。您当然应该致力于避免冗余的数据库设计。这就是关系数据库的重点......

但现在到实际问题了!:-)

我认为您只是在寻找之前收到的答案的替代方案。

=======================
| 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 是什么意思(它是如何计算的?),但我希望这个答案能给你一个线索,你如何解决剩下的问题。

于 2013-05-05T05:36:16.393 回答