2013-05-05 60 views
-2

對不起,如果我的標題不清楚。我在用PHP創建一個網站,用戶可以提交帖子。我目前使用MySQL數據庫來存儲用戶和帖子。我還想存儲每個用戶和每個帖子之間的相關值。這是想法:什麼是最理想的方式(與php兼容)將相關值存儲在數據庫中?

 ----------------- 
     | 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

我認爲你缺少的是MySQL只是一個比最優化的存儲方式更糟糕的常數因素。當然,對於100個用戶和100個帖子,您有10,000個行,但使用「最佳」解決方案時,您有10,000個單元。 MySQL在這裏不能很好地擴展,但其他解決方案也沒有。 – icktoofay 2013-05-05 05:00:32

+0

謝謝!我只是不喜歡MySQL的想法,因爲對於10,000個單元中的每一個,我只會存儲相關值,但在MySQL解決方案中,我必須在每一行中存儲用戶標識和發佈標識。這基本上是存儲數據的三倍。加。我聽說MySQL對行數太多不太合適(我將在這個網站上有超過50個用戶和50個帖子) – vijrox 2013-05-05 05:05:23

+0

我不相信「MySQL不適合太多的行」。這就是*用於*的數據庫:存儲行。如果MySQL不能很好地執行數據庫的主要功能,那麼它是什麼樣的數據庫? MySQL是一個有一定聲譽的數據庫,所以我認爲它確實可以很好地處理大量的行。 – icktoofay 2013-05-05 05:07:39

回答

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(它是如何計算的),但我希望這個答案能夠讓你知道如何解決其餘問題。

+0

我有一個算法來計算#val超出了這個問題的範圍。至於有3張桌子的想法 - 是的,無論如何我會這樣做;我認爲這是暗示的(遺憾的是缺乏清晰度)。我不願意這樣做的原因是會有很多行和大量無關數據被存儲(請參閱我對我的問題的評論) – vijrox 2013-05-05 19:19:01

+0

@VijayRamamurthy - 好的,這是否回答您的問題? – bestprogrammerintheworld 2013-05-05 19:21:14

+0

是的,謝謝。我想我最終會這樣做,不要擔心我擔心行數太多。 – vijrox 2013-05-05 19:22:06

相關問題