mysql数据库设计结构帮助

mysql数据库设计结构帮助,mysql,database-design,Mysql,Database Design,我对数据库和mysql还不熟悉,我正试图了解如何设计我的数据库。我正在做一个测试项目,人们可以在这个项目中查看他们在某些橱柜中的物品。因此,用户可以单击橱柜,查看其中的所有架子以及每个架子上的所有物品 到目前为止,我已经计算出我需要以下表格: Item Table Item ID, Item Name Shelf Table Shelf ID, Shelf Number Cabinet Table Cabinet ID, Cabinet Name 我的重点是我需要什么关系表?我

我对数据库和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>');
$cabinetID=$\u获取['cabinetID'];
$sqlShelf=sprintf('SELECT shelf_id
现货
打开内部连接机柜(cabinet.cabinet\u id=shelf.cabinet\u id)
其中cabinet.cabinet_id=%s',$cabinetID);
$resultShelf=mysql\u查询($sqlShelf);
而($shelf=mysql\u fetch\u assoc($resultShelf)){
$shelfID=$shelf['shelf_id'];
$sqlItem=sprintf('选择*
从项目
上的内部连接架(item.shelf\u id=shelf.shelf\u id)
打开内部连接机柜(cabinet.cabinet\u id=shelf.cabinet\u id)
其中cabinet.cabinet\u id=%s
和shelf.shelf_id=%s',$cabinetID,$shelfID);
$resultItem=mysql\u查询($sqlItem);
回声(“”);
而($item=mysql\u fetch\u assoc($resultItem)){
echo(“”.$item['item\u name'.

”.PHP\u EOL); } 回声(“”);
在编写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 
);
下面是一个示例查询,它将为您获取特定文件柜中的所有项目(刚刚尝试过-效果很好):


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

Shelf_Cabinet Table
ShelfID, CabinetID


如果货架和橱柜、物品和货架之间存在多对多的关系,这是真的,但我不相信物理学会允许。谢谢,这很好,有助于这样思考。我真的可以厚颜无耻地得到一个示例查询吗!这不会让我,我没有足够的代表:(
Shelf_Cabinet Table
ShelfID, CabinetID
Item_Shelf Table
ItemID, ShelfID