Opis:
Do aplikacji będą logować się użytkownicy różnych sklepów, które mają różne produkty, parametry i właściwości parametrów. Uznałem, że mogą występować konflikty identyfikatorów w każdej z tabel, więc jako osobny PRIMARY KEY
dodałem identyfikator... w sumie wiersza (czy dobrze?).
Użytkownik jest przypisany do danego sklepu, który ma swoje produkty. Każdy z produktów ma parametry, a one swoje właściwości.
Sklep ma dużo produktów, a produkt jeszcze więcej parametrów. A każdy z parametrów posiada właściwości, też może mieć kilka (od 0 do x). Dzięki tym informacjom doszedłem do takiej bazy danych.
Struktura tabel wygenerowana przy użyciu SHOW CREATE TABLE name
:
-- users --
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(255) NOT NULL,
`created_at` datetime DEFAULT current_timestamp(),
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
-- shops --
CREATE TABLE `shops` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` int(11) NOT NULL,
`name` varchar(128) NOT NULL,
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
CONSTRAINT `shops_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `users` (`id`),
CONSTRAINT `shops_ibfk_2` FOREIGN KEY (`id`) REFERENCES `products` (`shop_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- products ---
CREATE TABLE `products` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`shop_id` int(11) NOT NULL,
`product_id` int(11) NOT NULL,
`product_name` varchar(512) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`id`),
KEY `shop_id` (`shop_id`),
KEY `product_id` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- parameters --
CREATE TABLE `parameters` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`shop_id` int(11) NOT NULL,
`product_id` int(11) NOT NULL,
`parameter_id` int(11) NOT NULL,
`parameter_name` varchar(128) NOT NULL,
PRIMARY KEY (`id`),
KEY `shop_id` (`shop_id`),
KEY `product_id` (`product_id`),
KEY `parameter_id` (`parameter_id`),
CONSTRAINT `parameters_ibfk_1` FOREIGN KEY (`product_id`) REFERENCES `products` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- parameter_values --
CREATE TABLE `parameter_values` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`shop_id` int(11) NOT NULL,
`product_id` int(11) NOT NULL,
`parameter_id` int(11) NOT NULL,
`value_id` int(11) NOT NULL,
`value_name` varchar(128) NOT NULL,
PRIMARY KEY (`id`),
KEY `shop_id` (`shop_id`),
KEY `parameter_id` (`parameter_id`),
KEY `product_id` (`product_id`),
KEY `value_id` (`value_id`),
CONSTRAINT `parameter_values_ibfk_1` FOREIGN KEY (`product_id`) REFERENCES `products` (`product_id`),
CONSTRAINT `parameter_values_ibfk_2` FOREIGN KEY (`parameter_id`) REFERENCES `parameters` (`parameter_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Ten wątek ma na celu poprawę mojej bazy danych pod kątem wydajności i optymalizacji. Może ktoś bardziej doświadczony udzieli rad, wskazówek, sugestii - co można zrobić lepiej, co jest źle, a co dobrze, aby uzyskać jak najlepsze efekty.
Czy to jest dobre podjeście?