下面是我的數據庫結構的簡化版本(建築概念網站的證明在MVC 2與實體框架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
但是,如果我強化參照完整性,當店主想要刪除商品,商品尺寸,甚至關閉他/她的整個商店時,我當然會遇到一個問題。
我已經確定的選項是:
- 級聯刪除:主要CON是接下來的時間中,他收藏最多的項目是完全丟失,
- 軟/邏輯刪除用戶登錄:在這種情況下,我回避他們,因爲當我在過去使用它們時,必須將
WHERE IsActive
添加到每個查詢都會使表連接變得繁瑣。另外我相信(糾正我,如果我錯了),這會增加EF4的一些複雜性,比如Items.Includes("ItemSizes")
。 - 不強制參照完整性(僅在
[FavouriteSizes].SizeID
FK和[ItemRatings].ItemID
FK):我從來沒有實際做過此事。這似乎是「最簡單」的答案,但我不確定它是否會在稍後回來咬我。
由於並非強制執行這些2個外鍵約束似乎是最簡單的選擇,我的實現將是:
- 添加
ItemName
到[FavouriteSizes]
,並與ItemSize.Item.ItemName
填充它,當一個用戶收藏夾的尺寸 - 如果收藏的物品不再可用,請添加助手以顯示通知(
FavouritedSize.Items Is Nothing
),以便用戶可以從收藏夾列表中刪除該物品。 - 確保任何「最高評分項目」類型報告只會拉回仍然存在的項目。
這個實施是否會引發問題?爲什麼我應該去實施軟刪除而不僅僅是不強制引用完整性(除了保存用於報告的歷史數據)之外,是否有足夠強的理由?我是否錯過了一個更適合的選項?
感謝您的額外架構輸入...我沒有添加額外的尺寸表,因爲尺寸信息是特定於商店的:一些商店使用「小 - $ 5,大 - $ 15」,其他商店使用「5 $ 10,10 15美元「,具體取決於商店銷售的商品和商品。 – 2010-12-08 02:45:28