より複雑なオブジェクトをデータベースに格納しようとするのはこれが初めてです。データベースの設計について助けが必要です。
データベースから保存して再生成したいレシピオブジェクト
{
"id": 2345,
"name": "cake",
"description": "yummy cake",
"categorys": [
17,
26
],
"persons": 4,
"author": 26,
"language": "de",
"unit": "en",
"variantOf": 34,
"specialTools": [
34,
44,
10
],
"img": "32598734.jpg",
"estTime": 2777,
"steps": {
"1": {
"title": "mix",
"description": "mix all together",
"img": "45854.jpg",
"timer": null,
"ingredients": [
{
"name": "Butter",
"color": "#227799",
"amount": 150,
"unit": "g"
},
{
"name": "egg",
"color": "#aaff22",
"amount": 3,
"unit": "pc"
},
{
"name": "sugar",
"color": "#22ffff",
"amount": 50,
"unit": "g"
}
]
},
"2": {
"title": "bake",
"description": "put it in the oven",
"img": null,
"timer": 2400,
"ingredients": [
{
"name": "butter",
"color": "#227799",
"amount": null,
"unit": null
},
{
"name": "sugar",
"color": "#22ffff",
"amount": null,
"unit": null
},
{
"name": "egg",
"color": "#aaff22",
"amount": null,
"unit": null
}
]
}
}
}
最も複雑な部分はsteps
オブジェクトです。各レシピには、各セットに割り当てられたさまざまな材料を含むさまざまな数のステップを含めることができます。
これが私が作成 したデータベース設計です
recipe_id, step_id
外部キーです。レシピは材料、カテゴリ別にソートできる必要があるため、すべてを別のテーブルに入れたい...
最も重要なテーブルを生成するためのSQL コード
-- ------------------------------------------------ ----- -- テーブル `dev_Recipe`.`recipe` -- ------------------------------------------------ ----- CREATE TABLE IF NOT EXISTS `dev_Recipe`.`recipe` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `name` VARCHAR(255) NULL 、 `説明` TEXT NULL 、 `author_id` INT UNSIGNED NOT NULL , 主キー (`id`) 、 INDEX `author_id_idx` (`author_id` ASC) 、 CONSTRAINT `author_id` FOREIGN KEY (`author_id` ) REFERENCES `dev_Recipe`.`users` (`id` ) 削除時アクションなし 更新時アクションなし) エンジン = InnoDB; -- ------------------------------------------------ ----- -- テーブル `dev_Recipe`.`step` -- ------------------------------------------------ ----- CREATE TABLE IF NOT EXISTS `dev_Recipe`.`step` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `recipe_id` INT UNSIGNED NOT NULL , `step_number` INT UNSIGNED NOT NULL , `説明` TEXT NULL 、 `timer` INT UNSIGNED NULL , `image` VARCHAR(100) NULL , 主キー (`id`) 、 INDEX `recipe_id_idx` (`recipe_id` ASC) 、 CONSTRAINT `step_recipe_id` FOREIGN KEY (`recipe_id` ) REFERENCES `dev_Recipe`.`recipe` (`id` ) 削除時アクションなし 更新時アクションなし) エンジン = InnoDB; -- ------------------------------------------------ ----- -- テーブル `dev_Recipe`.`ingredient` -- ------------------------------------------------ ----- CREATE TABLE IF NOT EXISTS `dev_Recipe`.`ingredient` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `name` VARCHAR(45) NOT NULL 、 `color` INT NOT NULL , `img` VARCHAR(45) NULL 、 主キー (`id`) ) エンジン = InnoDB; -- ------------------------------------------------ ----- -- テーブル `dev_Recipe`.`step_ingredients` -- ------------------------------------------------ ----- CREATE TABLE IF NOT EXISTS `dev_Recipe`.`step_ingredients` ( `recipe_id` INT UNSIGNED NOT NULL , `ingredient_id` INT UNSIGNED NOT NULL , `step_id` INT UNSIGNED NOT NULL , `amount` INT NULL , `ユニット` VARCHAR(25) NULL , INDEX `recipe_id_idx` (`recipe_id` ASC) 、 INDEX `ingredient_id_idx` (`ingredient_id` ASC) 、 INDEX `step_id_idx` (`step_id` ASC) 、 PRIMARY KEY (`recipe_id`, `step_id`) , CONSTRAINT `step_ing_recipe_id` FOREIGN KEY (`recipe_id` ) REFERENCES `dev_Recipe`.`recipe` (`id` ) 削除時アクションなし 更新なしで、 CONSTRAINT `ingredient_step_ing_id` FOREIGN KEY (`ingredient_id` ) REFERENCES `dev_Recipe`.`ingredient` (`id` ) 削除時アクションなし 更新なしで、 CONSTRAINT `step_ing_id` 外部キー (`step_id` ) REFERENCES `dev_Recipe`.`step` (`id` ) 削除時アクションなし 更新時アクションなし) エンジン = InnoDB;
これまで結合テーブルを行ったことがないので、それが私の問題に対する正しいアプローチであるかどうかはわかりません。それは合理的な設計であり、それを最適化する方法は?
とをrecipes
繋げた別のデザインを作りました。最初のレイアウトの方がクエリしやすいと思います。を見ただけで検索できるからですが、わかりません。何かご意見は?step
step
ingredients
ingredients_id
recipe_id
step_ingredients