Đây là lần đầu tiên tôi đang cố gắng lưu trữ một đối tượng phức tạp hơn vào cơ sở dữ liệu. Tôi cần trợ giúp về thiết kế cơ sở dữ liệu.Cách cấu trúc cơ sở dữ liệu với nhiều bảng tham gia
Các recipe Object Tôi muốn để lưu trữ và tái sinh từ cơ sở dữ liệu
{
"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
}
]
}
}
}
Phần phức tạp nhất là đối tượng steps
. Mỗi công thức có thể có một số bước khác nhau với các thành phần khác nhau được gán cho mỗi bộ.
Dưới đây là một thiết kế cơ sở dữ liệu tôi đã
recipe_id, step_id
là chìa khóa nước ngoài. Tôi muốn tất cả mọi thứ trong các bảng khác nhau, bởi vì các công thức nấu ăn nên có thể phân loại theo nguyên liệu, chuyên cung ...
mã SQL để tạo ra bảng quan trọng nhất
-- ----------------------------------------------------- -- Table `dev_Recipe`.`recipe` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `dev_Recipe`.`recipe` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `name` VARCHAR(255) NULL , `description` TEXT NULL , `author_id` INT UNSIGNED NOT NULL , PRIMARY KEY (`id`) , INDEX `author_id_idx` (`author_id` ASC) , CONSTRAINT `author_id` FOREIGN KEY (`author_id`) REFERENCES `dev_Recipe`.`users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `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 , `description` TEXT NULL , `timer` INT UNSIGNED NULL , `image` VARCHAR(100) NULL , PRIMARY KEY (`id`) , INDEX `recipe_id_idx` (`recipe_id` ASC) , CONSTRAINT `step_recipe_id` FOREIGN KEY (`recipe_id`) REFERENCES `dev_Recipe`.`recipe` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `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 , PRIMARY KEY (`id`)) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `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 , `unit` 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`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `ingredient_step_ing_id` FOREIGN KEY (`ingredient_id`) REFERENCES `dev_Recipe`.`ingredient` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `step_ing_id` FOREIGN KEY (`step_id`) REFERENCES `dev_Recipe`.`step` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB;
Vì tôi chưa bao giờ làm tham gia bảng trước đó, Tôi không biết nếu đó là cách tiếp cận đúng cho vấn đề của tôi. Nó là một thiết kế lý tưởng và làm thế nào để tối ưu hóa nó?
Tôi đã thiết kế một thiết kế khác, trong đó recipes
được kết hợp với step
và step
với ingredients
. Tôi nghĩ bố cục đầu tiên dễ truy vấn hơn vì tôi có thể tìm kiếm theo số ingredients_id
recipe_id
bằng cách chỉ xem step_ingredients
, nhưng tôi không chắc chắn. Có suy nghĩ gì không?
Cảm ơn bạn đã trả lời. Bạn có thể đề xuất một cách tốt hơn để tổ chức các danh mục phụ không? Nó sẽ là tốt hơn để hạn chế mức độ tiểu thể loại và tạo ra một bảng cho mỗi lớp? Tôi không hoàn toàn nhận được những gì bạn muốn nói với "Có thể một thành phần bước tồn tại mà không có một bước". Thành phần 'bước 'không tồn tại mà không có' bước'. Và một 'bước' nên thuộc về một công thức. – Akkumulator
Trong trường hợp đó, một thành phần bước không nên cần một kết nối trực tiếp đến công thức, và một bước nên yêu cầu một FK để một công thức. Tiểu thể loại có thể phức tạp trong sql, có nhiều cách khác nhau để tổ chức các cấu trúc giống cây http://stackoverflow.com/questions/2175882/how-to-represent-a-data-tree-in-sql. Nếu bạn biết độ sâu của việc phân loại, có thể dễ dàng hơn để tạo các bảng được san bằng. – munch1324
Bạn có nghĩ sơ đồ thứ hai của tôi, tôi đã thêm vào sau, sẽ tốt hơn không? – Akkumulator