Sql-Server
對於購物項目中的使用者表,哪種方式更好 - SQL Server
我認為它會更快,但如果它是一個更好的數據庫設計和結構我不確定,
我是否應該在表中創建一個欄位
Users
來指示使用者是否有購物車,並且只有當它的 TRUE - 1 比OrderID
在表中搜尋他的ShoppingCart
?或者只是搜尋使用者登錄的時間
OrderID
?UserID
例子
[Users] ( UserID INT IDENTITY(1,1) PRIMARY KEY, EmailAddress NVARCHAR(320) UNIQUE, PasswordHash VARCHAR(32), FirstName VARCHAR(256) NOT NULL, LastName VARCHAR(256) NOT NULL, HasCart BIT DEFAULT 0 ) [ShoppingCart] ( OrderID INT PRIMARY KEY IDENTITY(1,1), UserID INT FOREIGN KEY REFERENCES [Users](UserID), CreatedDate DATETIME DEFAULT(GETDATE()) )
您應該將 UserID 放在 ShoppingCart 上,並將其編入索引。
create table ShoppingCart ( OrderID INT PRIMARY KEY IDENTITY(1,1), UserID INT FOREIGN KEY REFERENCES Users(UserID), INDEX ix_UserID (UserID), CreatedDate DATETIME DEFAULT(GETDATE()) )
對於舊版本的 SQL Server(2012 及之前),您必須使用單獨的語句創建索引:
CREATE INDEX ix_UserID on ShoppingCart(UserID)
這將支持通過 UserID 高效查找 ShoppingCart,並且如果您刪除使用者,SQL Server 將不必掃描 ShoppingCart 來查找該使用者的 ShoppingCart。
出於性能原因,無需創建額外的列來指示使用者是否有購物車,僅當它對您的案例具有邏輯意義時才這樣做。
Users
首先查詢表然後再查詢表實際上會降低性能(儘管可能可以忽略不計)ShoppingCart
,因為這是兩個操作將鎖定兩個表來完成可以通過始終直接搜尋ShoppingCart
表的一個操作來完成的操作。只要您的
ShoppingCart
表在涵蓋您的搜尋查詢的欄位上建立索引(例如,如果您按該欄位查詢,則為 OrderID),性能(尤其是一次只提取一個或少量記錄)將是非常快。這是因為索引將數據邏輯儲存在具有**O(log(n))**的 B-Tree 資料結構中。