2011-05-21 101 views
0

我是新來的數據庫和MySQL,並試圖讓我的頭如何設計我的數據庫。我正在測試項目,人們可以查看他們在某些櫥櫃中的物品。因此用戶可以點擊一個櫥櫃並查看其中的所有貨架以及每個貨架的所有物品。幫助數據庫設計結構爲mysql

到目前爲止,我已經工作了,我需要下表:

Item Table 
Item ID, Item Name 

Shelf Table 
Shelf ID, Shelf Number 

Cabinet Table 
Cabinet ID, Cabinet Name 

位我卡上是我需要什麼樣的關係表?我確信這對某個人來說非常簡單!

我能有持有像第四臺:

ItemID, Shelf ID, Cabinet ID 

就有意義,所以我可以查詢每一個貨架櫃貨架都和他們的項目?我相信這很容易回答,但是我的大腦受傷了!如果有幫助,我被告知使用MyIsam作爲存儲引擎。

感謝

編輯:

謝謝你,如果你不介意的另一個問題。你知道如何讓所有的貨架上的所有項目,使它們出現在HTML這樣的:

<div id="shelf-1"><p>spoon</p><p>fork</p> 
<div id="shelf-2"><p>knife</p></div> 

我有這似乎工作,但讀取周圍,我不認爲這是件好事以下練習循環查詢內部:

$cabinetID = $_GET['cabinetid']; 

$sqlShelf = sprintf(' SELECT shelf_id 
          FROM shelf 
          INNER JOIN cabinet ON (cabinet.cabinet_id = shelf.cabinet_id) 
          WHERE cabinet.cabinet_id = %s', $cabinetID); 

    $resultShelf = mysql_query($sqlShelf); 

while($shelf = mysql_fetch_assoc($resultShelf)) { 
       $shelfID = $shelf['shelf_id']; 

       $sqlItem = sprintf('SELECT * 
         FROM item 
         INNER JOIN shelf ON (item.shelf_id = shelf.shelf_id) 
         INNER JOIN cabinet ON (cabinet.cabinet_id = shelf.cabinet_id) 
         WHERE cabinet.cabinet_id = %s 
         AND shelf.shelf_id = %s', $cabinetID, $shelfID); 

       $resultItem = mysql_query($sqlItem); 

       echo('<div>'); 

       while($item = mysql_fetch_assoc($resultItem)) { 
        echo('<p>' . $item['item_name'] . '</p>' . PHP_EOL); 
       } 

       echo('</div>'); 

回答

2

在編寫SQL之前用英語考慮一下。

你可以有很多櫥櫃;每個櫃子有零個或多個貨架;每個架子上可以有零個或多個物品。

一個架子一次只能在一個櫃子裏;一個物品一次只能在一個貨架上。

所以我把它設計成三個表格,其中兩個是一對多的關係。

CREATE TABLE IF NOT EXISTS cabinet 
(
    cabinet_id bigint not null auto_increment, 
    primary key(cabinet_id) 
); 

CREATE TABLE IF NOT EXISTS shelf 
(
    shelf_id bigint not null auto_increment, 
    cabinet_id bigint, 
    primary key(shelf_id), 
    foreign key(cabinet_id) references cabinet(cabinet_id) on delete cascade on update cascade 
); 

CREATE TABLE IF NOT EXISTS item 
(
    item_id bigint not null auto_increment, 
    shelf_id bigint, 
    primary key(item_id), 
    foreign key(shelf_id) references shelf(shelf_id) on delete cascade on update cascade 
); 

這裏有一個簡單的查詢,將讓你在特定的櫥櫃中的所有項目(只是試圖 - 偉大工程):

SELECT item.item_id, cabinet.cabinet_id 
FROM item 
INNER JOIN shelf ON (item.shelf_id = shelf.shelf_id) 
INNER JOIN cabinet ON (cabinet.cabinet_id = shelf.cabinet_id) 
+0

由於這是偉大的,有助於想想這樣。我可以真正厚顏無恥,並得到一個示例查詢! – Bob 2011-05-21 18:22:34

+0

爲什麼不接受答案呢? – duffymo 2011-05-21 18:26:57

+0

它不會讓我,我沒有足夠的代表:( – Bob 2011-05-21 18:33:55

0

您將需要兩個表之間的三個表來保存數據對應關係。

Shelf_Cabinet Table 
ShelfID, CabinetID 

Item_Shelf Table 
ItemID, ShelfID 
+1

如果擱板和櫃子,物品和擱板之間存在多對多的關係,這是真實的,但我不'我相信物理學會允許它。 – duffymo 2011-05-21 17:59:56