1

さて、USER_NAME、USER_ID、およびUSER_COLORを格納するユーザー用のテーブルが1つあり、USER_NAMEを格納するログ用の新しいテーブルを作成しているとしましょう。

ページを表示していて、このデータを受信する必要がある場合、ログに対して2つのクエリを実行してから、USER_NAME=USER_NAMEのユーザーを検索できます。

または、USER_NAME、USER_ID、およびUSER_COLORをすべてログに保存して、1回のクエリですべてのデータを取得できます。

何がより速くまたはより良くなるでしょうか?

サンプルクエリ

$sql = "SELECT id, username, level, namecolor FROM users ORDER BY level DESC"; 
$query = mysql_query($sql) or die(mysql_error());
$count = mysql_num_rows($query);
while($row = mysql_fetch_object($query)) {
    $Member_id = htmlspecialchars($row->id);
4

5 に答える 5

3

MySqlを使用しているため、データベースはリレーショナルデータベースです。

これにより(すでにご存知のとおり)多くの利点が得られるため、他のテーブル(この場合はログ)にユーザー情報(既に独自のテーブルに格納されている)を複製する代わりにjoins、ユーザー。

ユーザー情報を独自のテーブルに含めると、ログデータをクエリするときに次のようになります。

SELECT logs.log_id, logs.log_date, logs.user_name, users.user_color
FROM logs
LEFT JOIN users ON logs.user_name = users.user_name

もう1つのポイント:ユーザーテーブルに新しいフィールドを追加した場合(たとえば、電子メール)、ユーザー情報を複製するとどうなるかを考えてください。

于 2012-09-05T22:31:06.510 に答える
1

より良いのは、第3正規形のものです。簡単に言えば、これは、すべての非キー列がキー、キー全体、およびキー以外の何物にも依存しないことを意味するので、Coddを助けてください:-)

正規化レベルを下げるのには十分な理由がある場合もありますが、まれです。ユーザーIDごとに複数のユーザー名が使用されるなど、潜在的な問題を理解して軽減する必要があります。その逆も同様です。この場合、マルチテーブルバージョンに固執すると思います。

于 2012-09-05T22:31:30.377 に答える
0

これらのテーブルを結合することをお勧めします。

select users.*, logs.* from logs inner join users on logs.USER_NAME=users.USER_NAME

1つのクエリですべての情報を取得します。

于 2012-09-05T22:31:53.613 に答える
0

、、などUSER_NAMEのコアユーザー情報はユーザーごとに1つだけになるため、さまざまなテーブルに配置できると思います。一方、ログはユーザーごとに多くなる可能性があります。したがって、すべてをログテーブルに保存すると、ユーザーのログが発生するたびに、データベースは、などの追加情報を保存するためにより多くのスペースを使用します。USER_IDUSER_COLORUSER_NAMEUSER_IDUSER_COLOR

1つのクエリで両方のテーブルを組み合わせて結果を取得する方法を確認するために、よく読んJOINでおく必要があると思います。リンクmysqlのその他の読み物JOIN

クエリは、データの種類とデータベースからの取得方法に依存するため、ここでは提案できません。

于 2012-09-05T22:32:02.473 に答える
0

両方のテーブルを保持することをお勧めします。

データベース設計と最初の正規形は、同じデータを複数回持つべきではないことを示しています。

したがって、2番目のテーブルにすべてのデータを保存すると、設計が不適切になります。

良い例がありますhttp://en.wikipedia.org/wiki/First_normal_form

于 2012-09-05T22:33:19.023 に答える