2

データベースを設計していますが、一部のユーザー データを非公開にする方法について質問があります。

名前、都市、誕生日、伝記などのユーザーテーブルがあります。ユーザーは一部のデータを非公開にすることができます(他のユーザーはそのデータを見ることができます)。

まず、テーブルに列を追加して、列がプライベートかどうかを示すことを考えました。例えば:

User
-------

user_id  | name | city | cityIsPrivate | birthday | birthdayIsPrivate
---------+------+------+---------------+----------+------------------

または、varchar 列を追加して、どの列が非公開かを示す別の方法もあります。

User
-------

user_id  | name | city | birthday | privateColumns
---------+------+------+----------+---------------

そして、この privateColumns は次のようになります: "city:NO; birthday:YES".

ユーザー テーブルには、プライベートまたはパブリックにできる列が 3 つしかありません。テーブルにさらに 3 つの列を追加するだけです。

何かアドバイス?

4

3 に答える 3

1

次のように、別のテーブル (UserPrivateFields など) に、ユーザー ID と非公開にすることを選択したフィールドをリストすることができます。

UserID | PrivateField
-------+-------------
1      | Name
1      | City
2      | Birthday

情報を要求した人がユーザー情報を取得するプロシージャを実行している場合、次のようなクエリを作成できます (目的のユーザーの UserID がプロシージャに渡されると仮定します)。

CREATE TABLE #PublicUserFields (Publicfield varchar(50))
INSERT INTO #PublicUserFields (Publicfield)
SELECT Publicfield
FROM userPublicfields
WHERE userid = @userid

Declare @sql VARCHAR(MAX) = 'SELECT '
WHILE EXISTS (SELECT 1 FROM #PublicUserFields)
BEGIN
    DECLARE @Publicfield VARCHAR(50) = 
        (SELECT TOP 1 Publicfield FROM #PublicUserFields)
    SET @sql = @SQL + @Publicfield
    IF (SELECT COUNT(*) FROM #PublicUSERFIELDS) > 1
    BEGIN
        SET @SQL = @SQL + ', '
    END

    DELETE FROM #PublicUserFields 
    WHERE Publicfield = @Publicfield
END

SET @SQL = @SQL + ' FROM MainTable WHERE userID = @userID'

EXEC(@SQL)

私が動的 SQL に悩まされている理由は、このセットアップではパブリック フィールドの名前をメイン テーブルの列に直接結合できないためです。同じ文字列値を持つ他のレコードを選択または結合することしかできません。 . sys.columns に参加し、列の object_id で興味深いことを行うことでこれを回避できるかもしれませんが、このアプローチよりもはるかに簡単ではないようです。

これは、ユーザーが他の人に表示したいフィールドを動的に設定できる場合に意味があります。プライベート フィールドが既知で静的である場合は、2 つのカテゴリを分離し、プライベート テーブルの読み取りアクセス許可を厳しくするだけでよい場合があります。

于 2013-10-18T07:05:26.463 に答える