#php #mysql #database #phpmyadmin
#php #mysql #База данных #phpmyadmin
Вопрос:
Я создаю систему фильтрации с 3 шагами, и пока она работает, но теперь я хочу иметь элементы с большим количеством категорий. Все идентификаторы category_id являются целыми числами. Должен ли я изменить это или какой лучший вариант сделать это.
На данный момент это мое решение. Итак, у меня есть столбец (избыточность) для разделения партнеров, которые находятся в базе данных более одного раза, поэтому я не получаю двойных результатов, если я фильтрую для всех.
Но я хочу (если возможно) возможность писать больше категорий в category_id / subcategory_id / subcategory2_id, поэтому мне не нужно много раз записывать одного партнера в базу данных, и я все равно могу получить его в PHP.
Вот моя база данных в виде кода:
-- phpMyAdmin SQL Dump
-- version 5.0.2
-- https://www.phpmyadmin.net/
--
-- Host: localhost
-- Erstellungszeit: 19. Okt 2020 um 11:36
-- Server-Version: 10.4.13-MariaDB
-- PHP-Version: 7.4.8
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = " 00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Datenbank: `partnerfilter`
--
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `partner`
--
CREATE TABLE `partner` (
`partner_id` int(11) NOT NULL,
`category_id` int(11) NOT NULL,
`subcategory_id` int(11) NOT NULL,
`subcategory2_id` int(11) NOT NULL,
`partner_name` text NOT NULL,
`partner_logo` text NOT NULL DEFAULT '[Kein Bild vorhanden]',
`partner_link` text NOT NULL,
`status` tinyint(4) NOT NULL DEFAULT 1 COMMENT '1=Active | 0=Inactive',
`redundancy` int(11) NOT NULL DEFAULT 1 COMMENT '1 = First Objectrn0 = Doubled Object'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
--
-- RELATIONEN DER TABELLE `partner`:
-- `category_id`
-- `categories` -> `category_id`
-- `subcategory_id`
-- `subcategories` -> `subcategory_id`
-- `subcategory2_id`
-- `subcategories2` -> `subcategory2_id`
--
--
-- Daten für Tabelle `partner`
--
INSERT INTO `partner` (`partner_id`, `category_id`, `subcategory_id`, `subcategory2_id`, `partner_name`, `partner_logo`, `partner_link`, `status`, `redundancy`) VALUES
(2, 2, 2, 4, 'Udo Förster', 'url', '/udofoerster', 1, 1),
(3, 2, 2, 5, 'Testfirma', '[kein Logo vorhanden]', '/testfirma', 1, 1),
(4, 2, 2, 6, 'Brüninghoff', 'https://assets.kununu.com/images/images_logos/bruninghoff-gmbh-co-kg-194df.gif', '/brueninghoff', 1, 1),
(5, 2, 2, 4, 'Naturi', '[Kein Logo vorhanden]', '/naturi', 1, 1),
(6, 1, 6, 15, 'BlowerDoor', 'url', '/blowerdoor', 1, 1),
(7, 1, 9, 15, 'ante', 'https://www.ante-holz.de/fileadmin/_processed_/csm_Ante-Logo_bc1031754d.gif', '/ante', 1, 1),
(8, 1, 9, 15, 'ABA', 'url', '/aba-holz', 1, 1),
(9, 2, 13, 15, 'Udo Förster', 'url', '/udofoerster', 1, 0);
--
-- Indizes der exportierten Tabellen
--
--
-- Indizes für die Tabelle `partner`
--
ALTER TABLE `partner`
ADD PRIMARY KEY (`partner_id`),
ADD KEY `category_id` (`category_id`),
ADD KEY `subcategory_id` (`subcategory_id`),
ADD KEY `subcategory2_id` (`subcategory2_id`);
--
-- AUTO_INCREMENT für exportierte Tabellen
--
--
-- AUTO_INCREMENT für Tabelle `partner`
--
ALTER TABLE `partner`
MODIFY `partner_id` int(11) NOT NULL AUTO_INCREMENT,
AUTO_INCREMENT=10;
--
-- Constraints der exportierten Tabellen
--
--
-- Constraints der Tabelle `partner`
--
ALTER TABLE `partner`
ADD CONSTRAINT `partner_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`category_id`),
ADD CONSTRAINT `partner_ibfk_2` FOREIGN KEY (`subcategory_id`) REFERENCES `subcategories` (`subcategory_id`),
ADD CONSTRAINT `partner_ibfk_3` FOREIGN KEY (`subcategory2_id`) REFERENCES `subcategories2` (`subcategory2_id`);
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
Спасибо 🙂
Комментарии:
1. Пожалуйста, опубликуйте структуру таблиц в виде текста, а не изображений
2. Я этого не писал. Как я могу видеть таблицы в виде текста?
3. Просто запустите запрос
SHOW CREATE TABLE your_table_name;
и скопируйте результат здесь4. Только что обновлено…
Ответ №1:
Речь идет о структуре данных «многие ко многим». Один партнер может принадлежать ко многим подкатегориям, например, в каждой из подкатегорий может быть много партнеров, верно? Классическим решением для этого является решение с тремя таблицами:
CREATE TABLE `partners` (
`id` int,
-- ...
-- rest partner fields
-- ...
PRIMARY KEY(`id`)
);
CREATE TABLE `subcategories` (
`id` int,
-- ...
-- rest subcategory fields
-- ...
PRIMARY KEY(`id`)
);
CREATE TABLE `partner_subcategories` (
`partner_id` int,
`subcategory_id` int,
PRIMARY KEY(`partner_id`, `subcategory_id`),
KEY `partner_fk` (`partner_id`),
CONSTRAINT `partner_fk` FOREIGN KEY (`partner_id`) REFERENCES `partners`(`id`),
KEY `subcategory_fk` (`subcategory_id`),
CONSTRAINT `subcategory_fk` FOREIGN KEY (`subcategory_id`) REFERENCES `subcategories` (`id`)
);
Здесь скрипка SQLize.online
Комментарии:
1. Итак, теперь у меня есть таблицы: категории, подкатегории, подкатегории2 и партнер. И теперь я должен создать еще 3?
2. Если партнер может принадлежать к нескольким категориям, добавьте одну категорию
partner_categories
. Если он может принадлежать более чем одной подкатегории, создайте таблицуpartner_subcategories
и так далее…3. Принадлежит ли ваша подкатегория к одной категории?
4. ‘categories’ связан с ‘subcategories’, а ‘subcategories’ связан с ‘subcategories2’. Эти три таблицы являются этапами фильтрации (выпадающие списки категорий), поэтому, когда вы выбираете категорию из «категории», вы получаете больше категорий из «подкатегории» и так далее. И эти три таблицы связаны с таблицей ‘partner’ для получения конечных результатов. Я надеюсь, вы понимаете, что я имею в виду, и я хочу сказать, что я новичок в этом, поэтому, пожалуйста, попробуйте объяснить, чтобы я мог это понять. 🙂
5. Посмотрите, имеет ли смысл эта скрипка: sqlize.online/ …