5

最近質問したところ、ユーザーはデータベースを正規化する必要があると答えましたが、実際にはそうすべきではないと思います..

ロジックは次のようになります

ユーザーに応じて動的に実行されるスクリプトをデータベースに保存しています。

たとえば、スクリプトテーブルがあります

script_id | script_name
+----------------------+
12345       demo1
54462       demo2
90874       demo3
43058       demo4

そして今、ユーザーテーブル

allowed_script_ids
+-----------------+
21345|90874

これはここでは簡単ですが、 say を削除するとどうscript_id 90874なりますか? ユーザー テーブルからレコードが削除されないため、データベースを正規化するよう提案されましたが、ユーザーが 1000 のスクリプトにアクセスできる場合はどうなるでしょうか? そのために1000レコードが必要ですか?それとも、今のやり方を続けるべきですか?アクセスごとに各レコードエントリを挿入しても、そのユーザーのアクセスを取り消すたびにそれらを削除する必要があります。

4

3 に答える 3

6

1000 行は多くありません (同じように、10,000,000 でもありません)。データベースを正規化する (つまり、ユーザーをスクリプトに関連付ける) ことは、これに最適です。文字列を連結している場合は、使用していない限りTEXT(とにかくこれはばかばかしいです!)、とにかく多くのスクリプト ID を追加する前に、何らかの形式のフィールド長制限に達する可能性があります。

はい、この程度まで正規化することもお勧めします。

Script

script_id
name

User

user_id
...

User_Script

user_script_id
user_id
script_id

視覚化

.. 各関係は に入りUser_Scriptます。

これは、文字列を連結し、削除時に文字列からシーク/置換するよりもはるかにクリーンです。これにより、より高速でクリーンになり、実際にデータベースをはるかに合理化された方法で見ることができます。

現在、データベースからすべてのスクリプト名を取得するにはどうすればよいでしょうか? 上記のやや正規化された設計では、次のようなクエリを実行できます。

SELECT `user`.`first_name`, `script.name` FROM `User_Script`
INNER JOIN `Script` USING (`script_id`)
INNER JOIN `User` USING (`user_id`)
于 2013-01-15T12:29:24.637 に答える
2

はい、そのデータを正規化します。ユーザーとスクリプトを関連付ける 3 番目の表を作成する必要があります。

ユーザーが 1000 個のスクリプトにアクセスできる場合、この新しい 3 番目のテーブルには 1000 個のエントリが含まれることになりますが、それでも問題ありません。データの管理が容易であることがわかります。あなたが言うように、スクリプトが削除された場合、この 3 番目のテーブルのエントリも削除するのは簡単です。ユーザー テーブル。

これにより新しいテーブルで生成される行数について心配する必要はありません。MySQL は、テーブル内の何百万行も簡単に処理できます。まともなインデックスを作成すれば、これら 3 つのテーブルを非常に迅速に結合できます。おそらく、これから行う必要がある部分文字列の一致を実行するよりも高速です。

于 2013-01-15T12:30:13.257 に答える
0

ステータスビットを使用して、使用するアクセスを示すことができます。このようにして、一意のスクリプト id のインデックスを使用してすばやくアクセスできるという利点が得られます。更新するには、ブール ビットをリセットするだけです。

例えば

    user access
    script_id user_id isGranted
    ----------------------------
    21345     some_user_id yes

また、ユーザーの好みに基づいてスクリプトへのアクセスを常に許可または取得する必要がある場合、文字列を使用してユーザーがアクセスできる可能性のあるスクリプトを選別するという最初のアイデアは非効率的である可能性があります

このことを考慮

    12|34|45|56|

スクリプト 56 へのアクセスを繰り返し許可または取り消す必要がある場合はどうでしょうか。. . .この反復的なアクションのために文字列を取得して処理することはできません。これは不必要で非効率的です。その場合、ブールビットを設定すると、多くの処理の問題が解決され、節約されます

于 2013-01-15T12:33:48.000 に答える