2017-08-22 9 views
2

私は現在、最初のウェブアプリケーション(ERPシステム)を開発中です。私は現在、システムの特権機能を管理しています。私は、ユーザのデータとともにユーザテーブルに権限を保存する予定です。しかし、私は70以上の特権をユーザに与えることができます。私はそのような巨大なテーブルの前に私の短い経験と私は後で私は生産にシステムを置くときにどのような結果になるかわからない、私も間違っていたかどうかを知っている私は非常に苦労して編集する後でアプリケーションがあるので、私はそれが始まる前にここで尋ねると良いと思った。データベースユーザテーブルにユーザ権限を保存しても構いませんか?

は、それがこの

CREATE TABLE `user` (
    `id` int(6) unsigned NOT NULL, 
    `name` varchar(70) NOT NULL, 
    `type` ENUM('admin','user'), 
    PRIMARY KEY (`id`) 
) 

のようなテーブルを変更し、この

`p_insertSales` TINYINT(1) NOT NULL, 
`p_insertPurchases` TINYINT(1) NOT NULL, 
`p_insertCollections` TINYINT(1) NOT NULL, 
`p_deleteSales` TINYINT(1) NOT NULL, 
`p_deletePurchases` TINYINT(1) NOT NULL, 
`p_manageInventory` TINYINT(1) NOT NULL, 
`p_insertEntries` TINYINT(1) NOT NULL, 
`p_manageAccountingSystem` TINYINT(1) NOT NULL, 
`p_deleteEntries` TINYINT(1) NOT NULL, 
`p_approveEntries` TINYINT(1) NOT NULL, 
`p_seeFinancialReports` TINYINT(1) NOT NULL, 
`p_seeLedger` TINYINT(1) NOT NULL, 
`p_manageCashAccounts` TINYINT(1) NOT NULL, 
`p_insertCurrentAccounts` TINYINT(1) NOT NULL, 
`p_seeVisitorsMessages` TINYINT(1) NOT NULL, 
`p_seePurchaseOrders` TINYINT(1) NOT NULL, 

-- ... more than 60 more privileges. 

のような70個の列について追加してOKです性能とソフトウェア設計の面でそれを行うには、それはOKですか?

私は、フロントコントローラエリアでのリクエスト処理の開始時にとにかくクライアントデータをロードしていますので、この方法は私が維持するのが容易になり、私は追加することによって、(後の権限を変更することができ、それをやったので新しいもの、または取り除く)。

+1

から権限を削除(クラスなど)は、既存の権限

  • を削除し、新たな権限
  • を追加します。

    この構造は、それが簡単になりますdba.stackexchange.comに関するさらに多くの質問。そのようにするか、2つのテーブルを追加することができます:ロール/特権のためのものと、2つのテーブルに一致するピボットテーブル。最初の方法は、新しい特権を追加するたびに列を追加することを意味し、2番目の方法はデータを追加するだけです。 – aynber

  • +1

    私はそれは* OK *だと思いますが、それは私がそれをやる方法ではありません。 – Strawberry

    +1

    私は非常にあなたが計画していることをやっていないことをお勧めします。以下のゴードンの答えは100%です。 「ロール」のユーザー/特権ロジックに余分なレイヤーを追加することを検討することをお勧めします。ロールは複数の権限で定義され、ユーザーはロールを選択します。これにより、新しいユーザをロールに割り当てることができ(そしてバケットを獲得する)、ずっと簡単に行えます。今のところ、特権テーブルとユーザー/特権の間の接合テーブルを持つことは素晴らしいスタートです。 – JNevill

    答えて

    8

    おそらく良い考えではありません。あなたは、権限ごとに1つの行を持つテーブルを持つ必要があります

    create table Privileges (
        privilegeId int auto_increment primary key, 
        name varchar(255) 
    ); 
    

    とジャンクションテーブル:

    create table UserPrivileges (
        userId int not null, 
        privilegeId not null, 
        constraint fk_UserPrivileges_userid foreign key (userid) references users(userid), 
        constraint fk_UserPrivileges_privileges id foreign key (privilegeid) references users(userid) 
    ); 
    

    これらのテーブルは、他の列を持つことができます。たとえば、Privilegesには、特権に関する他の情報が含まれている可能性があります。 には、挿入/更新の日付と変更の可能性があります。

    • 追加し、おそらくだ既存のユーザー
    +2

    私は同じ解決策で中間回答でした。これは、Gが言うように、あなたが特権のリストを修正することができるように、良いプラクティスです。個人的には、 'validfrom'と' validto'を 'UserPriviledges'テーブルに追加して履歴を記録させます。 – JohnHC

    +0

    デフォルトのテーブルエンジンは、参照するためにはinnodbでなければならないことに注意してください。デフォルトのエンジンがMyISAMの場合は、Engine = InnoDBをcreate table文に追加する必要があります(https://dev.mysql.com/doc/refman/5.7/en/using-innodb-tables.html)。 –

    関連する問題