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,
);

請求承認を使用しています。ユーザーがサインアップし、ID が作成されたとき。ID にはクレームが含まれ、各クレームには型と値があります。

UsernameType > USERS からのユーザー名 EmailType > USERS からの電子メール NameType > USERS_PROFILES からの名前 RoleType > USERS_CLAIMS から直接

そのため、3 つのテーブルの多くの列から ID を作成しています。

クレーム認証に移行したため、これになりました。

質問

ユーザー名、電子メール、および名前を USERS_CLAIMS に移動する必要がありますか? USERS_PROFILES テーブルは消えます...そして、USERS テーブルには「UserId、LastLoginDate、CreatedDate、...」などの情報のみが含まれます。

ユーザー名でユーザーを取得したい場合は、ユーザー名タイプのクレームを取得するだけです...

ユーザーをサインインさせたい場合は、すべてのクレームを取得して ID を作成するだけです。

したがって、ID モデルは SQL テーブルに非常に似ています。

これは理にかなっていますか?どのようにテーブルを設計しますか?

ありがとう、ミゲル

4

2 に答える 2

2

キー値ストアを作成しています。それらを 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
于 2013-10-11T00:26:30.173 に答える
2

ユーザーは複数のプロファイルを持つことができますか? そうでない場合、「USERS_PROFILES」テーブルは必要ありません。「USERS」テーブルの「Username」列と「Email」列を保持します。それらを「USERS_CLAIMS」テーブルに置くと、ユーザーがクレームを提出するたびに冗長な情報を保存することになります。

ユーザーに対してどのような追跡を行いたいかわかりませんが、ユーザーがいつサインインしたかを追跡する別のテーブルを用意することをお勧めします。次のようなものです。

CREATE TABLE USERS_LOG (user_id INT, log_in DATETIME);

次に、「USERS」テーブルの「LastLoginDate」を取り除き、結合を実行して、ユーザーが最後にサインインした時間を取得します。これにより、ユーザーを追跡する方法が増え、ブロックを作成する必要がなくなります。 「USERS」テーブルを常に更新してください。

于 2013-10-11T00:30:43.857 に答える