【发布时间】:2010-12-08 10:32:29
【问题描述】:
下面是我的数据库结构的简化版本(在 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].SizeIDFK 和[ItemRatings].ItemIDFK 上):我以前从未真正这样做过。这似乎是“最简单”的答案,但我不确定它以后是否会回来咬我。
鉴于不强制执行这两个外键约束似乎是最简单的选择,我的实现是:
- 将
ItemName添加到[FavouriteSizes],并在用户喜欢某个尺寸时使用ItemSize.Item.ItemName填充它 - 添加一个助手以在收藏项不再可用时显示通知 (
FavouritedSize.Items Is Nothing),以便用户可以从他们的收藏列表中删除该项。 - 确保任何“评分最高的项目”类型的报告只撤回仍然存在的项目。
此实施是否会在未来引发问题?是否有足够充分的理由让我不遗余力地实施软删除,而不是仅仅不强制执行参照完整性(除了保留历史数据以供报告)?我是否错过了更适合的选项?
【问题讨论】:
标签: sql-server asp.net-mvc-2 entity-framework-4