2010-03-12 101 views
3

使用MySQL存儲動態數據的最佳方式是什麼?假設我有一個表格,其中一個項目是「動態」的。對於某些條目,我需要存儲一個值,但對於其他條目,則可能是一百個值。例如,假設我有以下簡單表格:MySQL多維數組

CREATE TABLE manager 
( 
name char(50), 
worker_1_name(50), 
worker_2_name(50), 
... 
worker_N_name(50) 
); 

顯然,這不是建立數據庫的理想方法。因爲我必須容納經理可能擁有的最大團隊,所以我在數據庫中浪費了很多空間。我更喜歡的是可以使用一張表作爲另一個表的成員(就像我在C++中通過繼承一樣),可以由「經理」表使用它來處理可變數量的僱員。它可能看起來像這樣。

CREATE TABLE manager 
( 
name char(50), 
underlings WORKERS 
); 

CREATE TABLE WORKERS 
( 
name char(50), 
); 

我希望能夠向每位經理添加可變數量的工作人員。這是可能的還是我被限制列舉所有可能的員工數量,儘管我很少使用完整補充版本?

回答

1

一般情況下,你應該做類似如下:

CREATE TABLE managers ( 
    manager_id int, 
    name  char(50) 
); 

CREATE TABLE workers (
    name  char(50), 
    manager_id int 
); 

這是你應該如何在relation model代表「可變數量的工人」。

+0

這具體是[數據庫規範化](http://en.wikipedia.org/wiki/Database_normalization)。它在關係模型鏈接中被提及,但它是一個非常大的頁面來找到它。 – phazei 2011-03-24 17:45:02

0

您可以使用ID列來跟蹤工作人員作爲同一個表中的記錄。

CREATE TABLE manager 
(
name char(50), 
id int 
); 

CREATE TABLE WORKERS 
(
managerID int, 
name char(50) 
); 

允許在工人重複managerIDs ...當你想要得到具體的工人經理,只需選擇名工人,其中經理ID = ID,它將返回所有的工人爲經理。如果你需要更復雜的查找,你也可以使用Joins。

0

你可以自動增量ID分配給經理,並使用外鍵工人鏈接到它:

manager 
    id 
    name 

worker 
    id 
    manager_id 
    name 
0

您可以創建一箇中間的映射表。像下面這樣:

manager(id, name) 
managerWorkerMapping(managerId, workerId) 
worker(id, name) 

現在,讓所有的工人爲特定的經理,你可以運行下面的查詢:

select w.name from worker w, manager m, managerWorkerMapping mwm 
where m.name = 'manager name' and 
     m.id = mwm.managerid and 
     mwm.workerId = w.id 

需要注意的是這種模式,它可能是很重要的工人也可以有多個經理。

0
select w.name from worker w, manager m, managerWorkerMapping mwm 
where m.name = 'manager name' and 
     m.id = mwm.managerid and 
     w.id = mwm.workerId 
+0

你能否提供一些解釋來解決這個問題?你做了什麼根本不同,爲什麼它是OP的解決方案? – corsiKa 2012-11-29 02:29:18

+0

@cliff - 雖然查詢語句很有用,但可以考慮將其添加到現有答案中。它本身並不回答OP提出的問題。 – 2012-11-29 02:29:38

+0

[其他答案](http://stackoverflow.com/a/2433788/1402846)的完全重複。 – Pang 2012-11-29 02:30:01