2013-10-11 25 views
0

在數據庫中,我有表:USERS,USERS_PROFILES,USERS_CLAIMS。聲明身份驗證的數據庫架構

create table dbo.USERS 
(
    Id int identity not null, 
    Username nvarchar (120) not null, 
    Email nvarchar (120) not null 
); 
create table dbo.USERS_PROFILES 
(
    Id int not null, 
    [Name] nvarchar (80) not null 
); 
create table dbo.USERS_CLAIMS 
(
    Id int not null, 
    [Type] nvarchar (200) not null, 
    Value nvarchar (200) not null, 
); 

我正在使用索賠授權。當用戶註冊並創建身份時。 身份包含的權利要求和每個要求都有一個類型和值:從USERS EMAILTYPE>從用戶的電子郵件 NAMETYPE>名稱從USERS_PROFILES 角色類型>直接

UsernameType>用戶名從USERS_CLAIMS

所以我創建來自3個表中多列的身份。

我結束了這一點,因爲我遷移到索賠驗證。

問題

我應該移動用戶名,電子郵件和名稱USERS_CLAIMS? 的USERS_PROFILES表將消失... 和用戶表將包含只喜歡信息「用戶ID,LastLoginDate,CreatedDate,...」

如果我想要得到的用戶名的用戶,我只想拿到類型的用戶名的索賠...

如果我想登錄用戶,我只需要獲取所有聲明並創建身份。

因此,身份模型與SQL表非常相似。

這是否有意義?你會如何設計表格?

謝謝你, 米格爾

回答

1

您正在創建一個鍵值存儲。他們是在SQL中查詢的噩夢。考慮通過USER_CLAIMS表中的值查詢用戶屬性的難度。示例:

-- Users with name and email by username 
SELECT p.ID, p.Username, p.Name, p.Email, u.LastLoggedIN 
FROM USER_PROFILES p 
INNER JOIN Users u on p.ID = u.ID 
WHERE p.ID = @UserID 

-- Users with name and email by username with a claims table 
-- Does not specify whether there is only one email, so this could return multiple 
-- rows for a single user. 
SELECT p.ID, cUName.Value as Username, cName.Value as Name, cEMail.Value as Email, u.LastLoggedIN 
FROM Users u 
LEFT OUTER JOIN USER_CLAIMS cName ON u.ID = cName.ID and cName.[Type] = 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name' 
LEFT OUTER JOIN USER_CLAIMS cUName ON u.ID = cUName.ID and cUName.[Type] = 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier' 
LEFT OUTER JOIN USER_CLAIMS cEmail ON u.ID = cEmail.ID and cEmail.[Type] = 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/email' 
WHERE p.ID = @UserID 
+0

是的,那正是我所害怕的......我應該爲角色設置角色表並將其他信息存儲在USERS表上?然後將所有信息遷移到我的應用程序的聲明標識上? –

+0

是的。您通過聲明呈現數據的事實不應該顯着改變您的模式。使數據存儲容易訪問和操作。從單個行返回多個聲明比從多個聲明返回單個行更加容易。 – Mitch

1

用戶可以有多個配置文件嗎?如果不是,則不需要「USERS_PROFILES」表。在「USERS」表上保留「用戶名」和「電子郵件」列。如果您將它們放在「USERS_CLAIMS」表中,那麼您將在用戶提出索賠時隨時存儲冗餘信息。

我不知道你喜歡什麼樣的跟蹤,以對您的用戶,但我會建議有一個單獨的表跟蹤當用戶跡象,事情是這樣的:

CREATE TABLE USERS_LOG (user_id INT, log_in DATETIME); 

你然後可以擺脫「USERS」表上的「LastLoginDate」,並進行連接以獲取用戶最後一次登錄。它會爲您提供更多跟蹤用戶的方式,並且不會在您的「USERS」表通過不斷更新它。

+0

而不是USERS_Log表爲什麼不使用我已經有的記錄表?每條記錄上都有一個標記,我可以選擇該用戶的項目......也許更靈活,並使用已存在的表格? –

+0

用戶名,birhtday等等......你會把它放在USERS表中嗎? USERS和USER_Profiles是分開的表...在USERS上,我放置了驗證工作所需的所有信息。在配置文件中,我放置其他信息,如姓名,生日,...這從應用程序更改爲應用程序...但USERS表是相同的...這種方式更容易維護和改變從一個應用程序到另一個應用程序 –

+0

關於USER_CLAIMS。這是否只適用於角色?或者對於所有不被查詢的東西?事實上,我永遠不知道......也許我需要通過角色查詢用戶......我真的不確定最好的方式來做到這一點。 –