2010-08-13 67 views
4

我會試着用一個例子來說明我的意思。如何處理mySQL DB中的複雜數據結構(OOP)?

假設您正在運行擁有用戶並允許發佈帖子的網站。

你的用戶列表以及每個用戶有:
名稱
密碼
選擇主題
帖子:
- 發佈
的時間/日期 - - 後
的標題後ID
- 該帖子的標籤數組

用戶ID /名稱/通過/主題很容易。每個變量可以是一列,ID自動增加。當我看到帖子時,我不知道該怎麼做。在友好的OOP中,我只需創建一個後期對象類型併爲用戶創建一個數組。我應該如何在MySQL數據庫中執行此操作?我有些震驚,這不是我教科書中的第一件事情,這是非常常見的。無論如何,我可能做一個可怕的醜陋的黑客入侵,但我想知道'正確'的方式。

謝謝!

+0

您可能想看看NoSql數據庫。 – 2010-08-13 22:06:40

+3

歡迎來到一個基於Set的世界 - 你在連接'USERS'和'POSTS'表記錄的多對多表後 – 2010-08-13 22:07:27

+2

這是如何複雜?看起來像你的郵購入門級cms – 2010-08-15 00:20:50

回答

8

成員:

id (autoinc) 
name 
password 
theme_id 

帖子:

id (autoinc) 
member_id 
title 
date 

標籤:

id (autoinc) 
name 

Tag_Relations:

tag_id 
post_id 

帖子是您的帖子的「數組」,其中member_id列將每個帖子鏈接到其用戶。 標籤是標籤的「數組」,標籤關係將每個標籤鏈接到一個或多個帖子。

這裏是你如何能得到的所有帖子&標籤爲用戶提供一個查詢的例子:

SELECT Members.name, Posts.title, Tag_Relations.item_id, Tags.name 
FROM Members LEFT 
JOIN Posts ON Members.id = Posts.member_id 
LEFT JOIN Tag_Relations ON Tag_Relations.post_id = Posts.id 
LEFT JOIN Tags ON Tags.id = Tag_Relations.tag_id 
WHERE Members.id = 2779; 

+----------+-----------------------------------+------------+---------+ 
| name  | title        | item_recid | name | 
+----------+-----------------------------------+------------+---------+ 
| Mike  | One Post's Title     |  973 | Houses! | 
| Mike  | One Post's Title     |  973 | Cars | 
| Mike  | One Post's Title     |  973 | Hats | 
| Mike  | Another Post's Title    |  973 | Cars | 
| Mike  | Yet another post     |  975 | Homes | 
| Mike  | Guess what?!      |  976 | Houses! | 
| Mike  | Another one :)     |  977 | Noses | 
| Mike  | Another one :)     |  977 | Mouth | 
| Mike  | Another one :)     |  977 | Head | 
| Mike  | Another one :)     |  977 | Knees | 
+----------+-----------------------------------+------------+---------+ 
+0

這似乎是非常低效的。忽略浪費的空間,您有需要搜索的處理問題。爲了簡單地顯示一個用戶的4條帖子,我必須搜索所有用戶的數千條帖子以找到這4條帖子。併爲每個帖子上的每個標籤(每個說4)我需要通過另一個數組搜索? – Idiomatic 2010-08-14 13:38:26

+2

您不通過記錄'搜索',您可以使用ID來有效地選擇您需要的記錄。沒有重複的數據,浪費的空間在哪裏? – 2010-08-14 23:52:33

+1

由於ID的重複,相比於OOP結構的佔用空間,有浪費的空間,但我想它並不多。在閱讀了關於SQL的一些信息之後,我意識到select命令的效率如此之高,以至於不像我原先想象的那麼大。感謝您的答覆和進一步的澄清! – Idiomatic 2010-08-15 03:09:16

1

瞭解normal forms(幾個很好的在線教程包括this one)。數據庫引擎在進行適當索引的平坦表之間進行JOIN操作時非常高效。

其基本思想是您可以識別數據庫中的實體(例如您提到的用戶/帖子/主題)以及它們之間的關係(一對一,一對多或多對多-許多)。這使您可以將數據拆分成可以高效重新組裝的平面表格。