Есть ли более эффективный способ хранения контейнеров объектов в Access?

Я пытаюсь создать реляционную базу данных в Access 2016, чтобы вести инвентаризацию предметов, хранящихся в нашем офисе. Большинство из них находятся в каких-то коробках, поэтому я решил, что каждая запись должна быть Container, которая может быть либо коробкой, сумкой или физическим контейнером, содержащим несколько предметов, либо это может быть просто один не содержащийся предмет. Например, принтер, стоящий на полке, по-прежнему будет считаться Container, но тип контейнера будет «Нет». В то время как коробка, полная безделушек, будет иметь тип «Коробка», и каждый из их предметов будет пронумерован в отдельной таблице.

Каждый Container может иметь более одного Item внутри - например. в коробке может быть пачка ручек, кабель HDMI и визитница. Все три предмета будут иметь свою собственную запись в таблице Item с различными свойствами, описывающими предмет (марка, цвет, количество, если имеется более одного одинакового предмета и т. д.). Каждый Item связан со своим Container с помощью ContainerID - связь одна -слишком много.

Проблема, которую я вижу в этом дизайне, заключается в избыточности данных - поскольку контейнер может быть как буквальным контейнером, так и просто одним элементом (например, принтером), в последнем случае мне пришлось бы назвать родителя Container «Принтер», а также назвать ребенок Item «Принтер». Или я мог бы оставить поле имени для Item пустым, чтобы называлось только Container, но я не уверен, считается ли это плохой практикой при проектировании баз данных.

Другая проблема заключается в том, что мой дизайн не позволяет аккуратно разместить подконтейнеры, например. если в большой коробке есть сумка, в которой есть и другие вещи, мне просто нужно указать описательный заголовок «Сумка с ручками, кабелями ...» Я не могу представить, что есть какой-либо способ сделать мою базу данных рекурсивной поэтому я не могу придумать никакого решения для этого. И, учитывая размер ящиков, с которыми я работаю, я часто сталкиваюсь с этим сценарием.

Итак, у меня два вопроса:

1) Есть ли обходной путь для решения, которое я пытаюсь реализовать, которое позволяет мне аккуратно хранить контейнеры внутри контейнеров?

2) Существует ли более эффективный дизайн базы данных для того, чего я пытаюсь достичь?

Я отредактировал вопрос, пытаясь сделать его менее «слишком широким», я был бы признателен за предложения по дальнейшему улучшению вместо дальнейшего близкого голосования.

Lou 10.05.2019 23:30

«Рекурсивность» — это свойство определений/алгоритмов/представлений, а не функций/отношений. Какие существуют варианты хранения иерархических данных в реляционной базе данных?Как создать иерархический рекурсивный запрос MySQL

philipxy 11.05.2019 00:35

Что такое «этот дизайн»? PS Очевидный дизайн, который, по-видимому, является вашим дизайном, таков: «элемент контейнера [c] содержит элемент [i]», «элемент [i] имеет описание [d]», «элемент [i] имеет свойство [p]». Насчет того, что «в моем дизайне нет подконтейнеров». Почему вы так думаете? Вы уже сказали: «Каждый элемент связан со своим контейнером с помощью ContainerID» и «контейнер может быть как буквальным контейнером, так и просто одним элементом». Таким образом, ваш дизайн «аккуратно вмещает подконтейнеры».

philipxy 11.05.2019 03:35

Что касается «хорошо» и «я не уверен, считается ли это плохой практикой при проектировании баз данных»: что мы отвечаем? Мы должны переписать учебник. Пришло время прочитать опубликованный академический учебник по информационному моделированию и проектированию баз данных. (Руководства по языкам и инструментам для записи и использования проектов не являются учебниками по информационному моделированию и проектированию баз данных.) PS «избыточность данных» (например, «эффективный», «хороший» и «плохой») не означает ничего конкретного и в любом случае только «плохая» «избыточность данных» не является «хорошей».

philipxy 11.05.2019 03:45
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

Создайте таблицу Items, в которой каждая запись содержит уникальный идентификатор ItemID в качестве первичного ключа и различные свойства элемента (например, описание, размер, цвет, значение, тип и т. д.), а также включает поле внешнего ключа с именем ContainerID или Container который может быть заполнен ItemID другого элемента в самой таблице Items:

В этом случае:

  • Ваш пример с принтером больше не контейнер, а просто элемент с соответствующими свойствами и без лишних лишних записей.
  • Многие элементы могут иметь одно и то же значение поля ContainerID, представляя элементы, составляющие вашу безделушку, содержащиеся в одной коробке.
  • Поскольку ContainerID относится к другому элементу в таблице Items, контейнер также может иметь значение ContainerID, что позволяет вам представлять бесконечный уровень вложенных контейнеров:

Эта проблема очень похожа на проблему представления управленческой иерархии (или вообще любой иерархии), которая исследована и решена в этот вопрос.

Это действительно хорошая идея, спасибо! Я немного смущен тем, как это будет реализовано, хотя я думаю, что понимаю теорию - вы предполагаете, что каждый Item имеет как свойство ContainerIDFK, так и свойство ContainerID, где первое относится к другому элементу ContainerID, так что элементы существенно связаны друг с другом?

Lou 10.05.2019 23:58

Не совсем — я говорю, что каждая запись в таблице Items будет иметь уникальный ItemID PK, а поле Container будет содержать ItemID другого элемента в таблице. Аналогично настройке, описанной в вопросе, указанном в моем ответе.

Lee Mac 11.05.2019 00:03

А, понятно, значит, для коробки, содержащей сумку с виджетом, у коробки есть запись в таблице Container, у сумки есть запись в таблице Item с ContainerID коробки, а у виджета есть запись в таблице Item. ContainerID стол с Container сумкой.

Lou 11.05.2019 00:06

Я думаю, у вас есть это, но будет только таблица Items без таблицы Container - я добавил пример в свой ответ, чтобы помочь объяснить. Конечно, это всего лишь один из способов приблизиться к этому.

Lee Mac 11.05.2019 00:18

Пожалуйста, используйте текст, а не изображения/ссылки, для текста, включая таблицы и ERD. Перефразируйте или процитируйте другой текст. Используйте изображения только для того, что не может быть выражено в виде текста или для дополнения текста. Изображения нельзя искать или вырезать и вставлять.

philipxy 11.05.2019 00:33

Спасибо, @Lee Mac, теперь я с вами. Можно ли связать ContainerID с ItemID без VBA?

Lou 11.05.2019 13:49

@Lou, да: вы можете использовать самообъединение в запросе - связанный ответ использует только VBA для построения SQL-запроса с достаточным количеством самообъединений для прохождения всех уровней иерархии.

Lee Mac 11.05.2019 14:54

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

Запись в существующие файлы в базе данных файловой системы
Размер базы данных Mysql превышает 4 терабайта? Azure поддерживает до 4
Вложенные свойства с наследованием
Должен ли я дублировать свою таблицу для правильного проектирования нормализованной базы данных?
Архитектура сервера веб-приложений: лучше иметь один большой сервер или много маленьких серверов?
Рекомендация || Как объект базы данных, проходящий через фазы, должен быть представлен в модели базы данных?
Это хорошая практика для базы данных для продуктов с несколькими единицами, себестоимостью и сроками годности
Направление структуры базы данных и идентификатор ссылки ссылаются на другую таблицу в зависимости от другого столбца
Как создавать таблицы сущностей для сущностей с несколькими именами
Добавление нового столбца в существующую таблицу со значением по умолчанию