Sql-Server

對於購物項目中的使用者表,哪種方式更好 - SQL Server

  • September 12, 2021

我認為它會更快,但如果它是一個更好的數據庫設計和結構我不確定,

我是否應該在表中創建一個欄位Users來指示使用者是否有購物車,並且只有當它的 TRUE - 1 比OrderID在表中搜尋他的ShoppingCart

或者只是搜尋使用者登錄的時間OrderIDUserID

例子

[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 資料結構中。

引用自:https://dba.stackexchange.com/questions/299449