帮助mysql的数据库设计结构

时间:2011-05-21 17:38:41

标签: mysql database-design

我是数据库和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 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

在这三个表之间需要两个表来保存对应关系的数据。

Shelf_Cabinet Table
ShelfID, CabinetID

Item_Shelf Table
ItemID, ShelfID