#sql-server #database #data-modeling
#sql-сервер #База данных #моделирование данных
Вопрос:
У меня есть система, которая позволяет участникам арендовать оборудование, и в системе должна быть история каждого предмета, который был арендован и кем. Система также должна отслеживать, у кого какое оборудование арендовано / выписано, а также сортировать оборудование по типу, статусу, имени и т. Д. Наконец, он также должен отправлять уведомления по электронной почте о просроченном оборудовании.
Я пытаюсь понять взаимосвязи и то, как я должен это моделировать. На данный момент мои текущие таблицы и мышление выглядят примерно так:
Member Table:
Id (PK)
MemberId
FirstName
LastName
Email
EquipmentItem Table:
Id (PK)
EquipmentName
EquipmentType (FK)
EquipmentStatus (FK)
TotalQuantity
RemainingQuantity
EquipmentStatus Table:
Id (PK)
StatusName
EquipmentType Table:
Id (PK)
TypeName
EquipmentRentalHistory Table:
Id (PK)
MemberId (FK)
EquipmentId (FK)
CheckOutDate
ReturnedDate
1) Я хочу знать отношения между ними. будет ли история аренды отношением «многие ко многим» между таблицей элементов и таблицей EquipmentItem?
2) Будет ли таблица EquipmentItem иметь отношение «один ко многим» между статусом и типом, насколько я понимаю, EquipmentItems может иметь много статусов или типов, но каждый статус или каждый тип может принадлежать только одному EquipmentItem.
3) Имеет ли смысл иметь поле количества в EquipmentItem, я работал в продуктовом магазине, поэтому я основываю логику на штрих-кодах, где одни и те же продукты обычно имеют один и тот же штрих-код, например (чипсы Cheetos Puff) все чипсы Cheetos Puff будут иметь один и тот же штрих-код, но будут иметь количествозначение в нем. Или было бы лучше, чтобы каждый элемент был уникальным, независимо от того, является ли он одним и тем же продуктом / моделью?
Моя логика была бы:
- участник сдает товар в аренду
- система регистрирует его в таблице истории
- затем система проверяет, сколько из одного и того же элемента было извлечено до сих пор, если, скажем, у нас общее количество 4 по этому элементу, и 3 участника его проверили
- мы обновляем поле оставшегося количества до разницы, поэтому в данном случае до 1
- затем система может отслеживать, у кого что было извлечено, возвращая все записи с возвращенной датой null
- затем система проверит все записи с возвращенной датой null, а затем выполнит диапазон дат в извлеченную дату, чтобы определить, просрочено ли оборудование
- отправка уведомлений на электронные письма участников, связанные с указанными записями, начиная с шага 6
Я просто хотел бы получить некоторую помощь, чтобы лучше понять взаимосвязь между ними, и если я правильно смоделировал свои таблицы, если нет, было бы здорово, если бы кто-нибудь мог указать мне правильное направление улучшения этого.
Ответ №1:
Чтобы ответить на ваши вопросы
-
Что касается моделирования в ERD, я не думаю, что это квалифицируется как отношение «многие ко многим», а скорее
EquipmentRentalHistory
является его собственной сущностью, которая имеет отношение «многие ко многим» с обоимиMember
иEquipmentItem
.«Многие ко многим» было бы больше похоже на «a
Member
имеет доступ к 0 … nEquipmentItems
, и к каждомуEquipmentItem
может быть доступно 0 … nMembers
«.
-
Я бы не согласился с тем, что это отношения «один ко многим».
Кислородный баллон и пара ласт могут быть классифицированы как «Снаряжение для подводного плавания» и иметь статус «Проверено».
У вас может быть несколько тегов «Снаряжение для подводного плавания» и присвоить каждому уникальному тегу «Снаряжение для подводного плавания» свой собственный
EquipmentItem
, но тогда вы просто будете создавать новые теги для каждого новогоEquipmentItem
, а не повторно использовать существующие.
-
Это действительно зависит от того, хотите ли вы точно определить, какое оборудование арендовал участник (может быть, что-то повреждено, вы можете отследить всех, кто арендовал это конкретное оборудование?). Если вы дифференцируете, то каждый элемент будет просто отдельной строкой. Вам также следует добавить новый столбец в качестве внешнего идентификатора, но вести учет не потребуется.
Если вам все равно, то я бы сохранил только
total
, но неavailable
. Если бы вы сохранилиavailable
столбец, вам постоянно приходилось бы обновлять его всякий раз, когда что-то регистрируетсяEquipmentRentalHistory
. Это будет раздражать, если таблицы не синхронизированы. Вы могли бы просто запроситьEquipmentRentalHistory
Id
количество оборудования и подсчитать записи where для количества оборудования,returnedDate IS NULL
которое используется в данный момент
Дополнительное примечание
Было бы неплохо иметь столбец «срок выполнения» в истории аренды, а не жестко кодировать расчет даты на случай, если вы хотите изменить сроки выполнения. Таким образом, вы также можете предоставлять расширения.