Элементы базы данных с несколькими категориями

#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/ …