Ниже приведена упрощенная версия моей структуры базы данных (создание экспериментального сайта в MVC 2 с Entity Framework 4 в качестве ORM):
[Stores]
StoreID (PK)
StoreName
[Items]
ItemID (PK)
ItemName
Description
StoreID (FK)
[ItemSizes]
SizeID (PK)
SizeName
Price
ItemID (FK)
[Users]
UserID (PK)
UserName
Магазины продают предметы разных размеров. [Users]
представляет стандартное хранилище членства asp.net.
Я хотел бы, чтобы пользователи могли добавлять в избранное и оценивать определенные предметы (и размеры), поэтому моим первоначальным импульсом было реализовать пару базовых таблиц сопоставления:
[FavouriteSizes]
UserID (PK) (FK)
SizeID (PK) (FK)
[ItemRatings]
UserID (PK) (FK)
ItemID (PK) (FK)
Rating
Однако, если я применю ссылочную целостность, я, конечно, столкнусь с проблемой, когда владелец магазина захочет удалить товар, размер товара или даже закрыть весь свой магазин.
Варианты, которые я определил, следующие:
- Каскадное удаление. Основной недостаток заключается в том, что при следующем входе пользователя в систему его избранные элементы полностью отсутствуют.
- Мягкие/логические удаления: я избегаю их в этом случае, потому что, когда я использовал их в прошлом, необходимость добавлять
WHERE IsActive
к каждому запросу становилась громоздкой при объединении таблиц. Кроме того, я считаю (поправьте меня, если я ошибаюсь), это добавляет сложности в EF4, скажем,Items.Includes("ItemSizes")
. - Несоблюдение ссылочной целостности (только для
[FavouriteSizes].SizeID
FK и[ItemRatings].ItemID
FK): я никогда не делал этого раньше. Это кажется «самым простым» ответом, но я не уверен, что он вернется ко мне позже.
Учитывая, что неприменение этих двух ограничений внешнего ключа кажется самым простым вариантом, моя реализация будет такой:
- Добавьте
ItemName
к[FavouriteSizes]
и заполните егоItemSize.Item.ItemName
, когда пользователь добавляет размер в избранное. - Добавьте помощника для отображения уведомления, если избранный элемент больше недоступен (
FavouritedSize.Items Is Nothing
), чтобы пользователи могли удалить этот элемент из своего списка избранного. - Убедитесь, что любой отчет типа «Элементы с самым высоким рейтингом» извлекает только те элементы, которые все еще существуют.
Эта реализация вызовет проблемы в будущем? Есть ли достаточно веская причина, по которой я должен утруждать себя реализацией обратимого удаления вместо того, чтобы просто не обеспечивать ссылочную целостность (кроме сохранения исторических данных для отчетов)? Я пропустил вариант, который подошёл бы лучше?