2016-09-19 7 views
0

私は異なる実験用のデータの行を持つテーブルを持っています。データの行にユーザー権限を格納する

experiment_id data_1 data_2 
------------- ------ ------- 
     1 
     2 
     3 
     4 
    .. 

私はジャンゴのユーザーデータベースを持っている、と私は、ユーザーがどの行にアクセスできるかを示す許可を格納し、ユーザーだけがために許可されている行を返したいと思います。

権限を保存するためにはどのような形式を使用しますか?単純に、各ユーザーの行とブールの各実験の列を持つ表?その場合、実験が追加されるたびにこのテーブルに行を追加する必要がありますか?

user experiment_1 experiment_2 experiment_3 .. 
---- ------------ ------------ ------------ -- 
user_1  True    False   False  .. 
user_2  False   True   False  .. 
.. 

トピックに関する参考資料は、私の現在のdbバックエンドであるため、sqlite3の機能に関連していることが望ましいでしょう。

+0

私は実験ごとに列を追加しません。しかし、それは私です。 [ジャンクションテーブル](http://stackoverflow.com/a/32620163)を参照してcsvの部分を無視してください。残りの部分が適用されます – Drew

+0

"相互参照テーブル"を含むソリューションを見てみましたか?私。テーブル「実験」、「ユーザー」、「User_Experiment_Permission」 – Frito

+1

[データベースの正規化](https:// ja。wikipedia.org/wiki/Database_normalization)。それはあなたの最終的なデザインを導くはずです。ヒント:あなたが提案しているものはうまくいくでしょうが、メンテナンスの悪夢になります。 –

答えて

0

私は100%あなたにとって最良のことは何もわかりませんが、過去には次のような解決策を使用して、照会と管理を簡単に行うことができます。

Table: Experiment 
Experiment_Id | data_1 | data_2 
----------------------------------- 
1    | ...  | ... 
2    | ...  | ... 

Table: User 
User_Name | Password | ... 
---------------------------- 
User1  | ... 
User2  | ... 

Table: User_Experiment_Permissions 
User_Name | Experiment | Can_Read | Can_Edit 
-------------------------------------------- 
User1 | 1   | true  | false 
User2 | 1   | false | false 
User1 | 2   | true  | true 
User2 | 2   | true  | false 

ご覧のとおり、新しい表では、ユーザーと実験の両方を参照しています。これにより、ユーザーと実験の関係をきめ細かく制御できます。また、この関係に新しい許可があった場合(例えば、can_delete)、新しい相互参照テーブルにこれをデフォルトで追加するだけで、変更がシステムに組み込まれます:-)

+0

私はそれがスケールされないこの方法だと思う、それは少数のユーザーと許可のために良いですが、 このテーブルは、ユーザーの大きな数と権限を更新するには、レコードを削除するのが難しくなる場合に備えて –

+0

@AmrMagdy That本当である可能性があります。私たちは実際にOPの規模/性能要件が何であるか分かりません。ソフトウェアが規模で機能するためには常に考慮すべき点や最適化が必要です。検討を指摘してくれてありがとう! – Frito

+0

これは私が質問で提案したものよりも洗練された解決策だと思います。 問題は、動作するものではなく、適切な規則を使用するほうが多いです。スケーラビリティは大きな懸念事項ではありません。私は100人のユーザーと100人のユーザーがいると思います。 – nven

0

これは依存していますアクセス許可を使用する方法。

- クエリ 内でこの値を使用します場合は、あなたが

  • permiss特定持つユーザーがbit masking番号フィールドを作成し、すべてのビットが許可を表します、とのことができます得るために例えば2つのオプションがありますAND/ORを使用して、必要な権限の組み合わせを取得します。
    • 利点:小さなサイズ、非常に効率的
    • 欠点:複雑な各権限(ソリューション)のためのフィールドを作成します
  • を実装します。
    • 利点:簡単に
    • デメリットを追加します。各権限


でスキーマを編集する必要があります - あなたが任意のクエリのためにそれを使用することはありませんやでそれを処理する場合、 JSONを1つの列にダンプすることができるコードは、ユーザーが好きなすべての権限を含みます。

{"experiment_1": 1, "experiment_2": 0, "experiment_3": 1} 
+0

JSONメソッドはまさに私がやっていたことです。プライマリキーがユーザー名、パーミッションがJSON BLOBの表があります。 唯一の問題は、json文字列を解析し、すべてのexperiment_idsを含むタプルを生成してからSQL呼び出しを行う必要があることです。だから、途中でいくつかのPythonオーバーヘッドが2つの呼び出しになるでしょう。私は、この言葉は実装が簡単ではあるが、非常にうまくスケールできないと心配していました。 – nven

関連する問題