Как избежать дублирования в базе данных

Вот моя база данных дизайна, я работаю над проектом электронной коммерции.

Поэтому, когда администратор создает новый продукт, у него новый идентификатор, и пользователь должен выбрать цвет и размер продукта. Проблема в том, что когда я создаю новый продукт (я устанавливаю идентификатор продукта как Identity Increment), я ввожу те же данные с тем же именем, тем же размером и цветом и т. д. точно так же, как тот же продукт, который я импортировал ранее Это означает, что продукт, который я только что созданный и предыдущий продукт отличаются, но на самом деле это всего лишь один продукт. Является причиной дублирующейся проблемы. Есть ли какие-либо решения этой проблемы?

Мой дизайн неправильный? Я хочу, чтобы, когда пользователь создавал аналогичный продукт, но с теми же атрибутами, это будет ошибка и сохранение не будет разрешено (кстати, я кодирую в ASP net Core)

Я решил эту проблему вот так

Чтобы избежать дублирования данных, нам нужно разбить дополнительную таблицу и установить ProductCode как уникальное значение.

Когда вам сообщили: «Вопрос с таким названием уже существует; будьте конкретнее». Это не повод опечатывать слово «дизайн». Ключевой частью было, пожалуйста, будьте более конкретны. Значимое название важно.

Thom A 13.03.2024 14:39

Вы так говорите, @NghĩaNghĩa, но я ненавижу работать с базами данных, где каждый столбец идентификатора называется id (одной из них является база данных Stack Overflow). Честно говоря, все становится намного чище и понятнее, когда в столбце ID указывается тип идентификатора.

Thom A 13.03.2024 15:01

решите, что делает продукт уникальным, и создайте уникальный индекс для этих столбцов, чтобы предотвратить дублирование.

P.Salmon 13.03.2024 15:04

Я думаю, вам повезет больше, если у вас будет продукт и отдельные атрибуты, цены и таблицы складского учета. Кроме того, если у вас есть дизайн футболки, как вы их разделите? Обычно должен быть какой-то номер артикула, который не генерируется автоматически. Кроме того, если честно, проектирование базы данных не является подходящей темой stackO.

siggemannen 13.03.2024 15:13

Я предлагаю вам изменить теги этого вопроса на C# ef-core и т. д. Ваша проблема не в базе данных, а в коде.

Thomas Koelle 13.03.2024 15:18

ок, я понял, поменяю

Nghĩa Nghĩa 13.03.2024 15:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Некоторые предложения:

Не используйте «Имя» или «Идентификатор» в качестве имен столбцов. Вместо этого используйте имя_продукта, имя_цвета, имя_размера, идентификатор_продукта, идентификатор_цвета, идентификатор_размера.

Удалить сумму из таблицы товаров. Создайте новую таблицу инвентаризации с идентификатором инвентаря, продуктом_fk, суммой, типом_контейнера, местоположением_контейнера, датой_вставки, датой истечения срока действия, идентификатором_штока.

Каждая таблица должна иметь автоматически увеличивающийся первичный ключ, скрытый от пользователей. Product_pk, Inventory_pk, color_pk, size_pk.

проверка вставок и изменений должна осуществляться через ваше приложение и только через ограничения базы данных в качестве последней меры безопасности. Дизайн таблиц и связи не следует использовать для предотвращения дублирования, потому что однажды у вас может быть пример, когда дубликат необходим.

Существует множество передовых методов проектирования баз данных, о которых вам следует знать перед началом проекта. См. https://www.sisense.com/blog/better-sql-schema/

Ответ принят как подходящий

Если вы хотите заблокировать дубликаты (в отношении выбранного количества столбцов), у вас есть несколько способов сделать это.

Основными из них будут:

  1. УНИКАЛЬНОЕ ОГРАНИЧЕНИЕ.

Блокирует любые попытки добавить существующую комбинацию столбцов.

ALTER TABLE TABLE ADD CONSTRAINT unique_combo UNIQUE (column1, column2, ...) 
  1. Скройте INSERT за STORED PROCEDURE, которая проверяет существующую комбинацию столбцов.

Что касается дизайна, я настоятельно рекомендую переработать дизайн вашей базы данных и подумать о таких вещах, как, например, имеет ли значение количество на уровне продукта, если вы можете иметь несколько размеров...

Другие вопросы по теме