2011-02-08 10 views
1

私はWebアプリケーションを作成しており、拡張しようとしています。私のWebアプリケーションでは、ユーザーが管理者であるかどうかを追跡するための特権を含むユーザー用のテーブルと、ページの動的コンテンツセクション用の非常に小さなテーブルと、Webサイト上の「イベント」を追跡するためのテーブルがあります。データベースとテーブル管理

ウェブアプリケーションの作成にあまり経験はありませんが、専門家がウェブアプリケーション用のデータベースとテーブルのシステムをどのように作成するかについてはわかりません。私のWebアプリケーションでは、Webサイトのメンバーごと、さらにはメッセージングシステムまで、さらにユーザー設定を追加する予定です。私は現在、すべてのコマンドをクエリするMySQLデータベースを使用してPHPを使用していますが、必要に応じてこれを変更するつもりです。対人関係のメッセージや各ユーザーの特定のユーザー設定など、コンテンツを追跡するのに最適な方法は何でしょうか。私はいつでも複数のデータベースを保有したいですか?おそらく、各ユーザーごとに複数のテーブルを用意したいのですか?これがどのように行われているか、行われなければならないかについての情報は非常に役に立ちます。

質問の広さは残念ですが、私はテーブルの使い方についての私のアイデアがプログラマーの経験と同じではないと感じているので、このWebアプリケーションを改革したいと思っています。ありがとうございました!

答えて

1

を折り返し報告ここでは、あなたの質問に私の一見長く、うまくいけば、あまりにも複雑ではない答えです。私はあなたの質問すべてではないにしても、ほとんどをカバーしたと思います。

ウェブアプリケーションの場合、「ユーザー」と呼ばれるユーザーテーブル、「UserSettings」と呼ばれる設定テーブル、または同等のものと説明的なもの、「PrivateMessages」テーブルのメッセージを持つことができます。次に、必要な余分なデータを格納する子テーブルが存在する可能性があります。

ユーザーのセキュリティは、設計と実装が難しい場合があります。あなたはグループ単位でやりたいのですか(多くのユーザーを抱えて、より簡単に権限を管理できるようにする場合)、あるいは小さなユーザーベースのため個別に割り当てるだけですか?あなたは、ユーザ情報、設定、彼らはに割り当てることができるグループとそれらが正しく分離に割り当てられているを持つことができますこの方法

Users 
UserSettings 
UserGroups 
UserAssignedGroups 

:単独のセキュリティを強化するために、4つのテーブルで終わるだろう。これにより、適度な柔軟性が得られ、上記のDrSARのように標準化基準に準拠します。

メッセージには、ユーザー名ではなくユーザーIDでメッセージを保存してください。たとえば、PrivateMessagesテーブルでは、最も基本的な情報を格納するMessageID、SenderUserID、RecipientUserID、Subject、BodyおよびDateSentがあります。

SELECT * FROM PrivateMessages WHERE RecipientUserID = 123556 

あなたのメッセージのためのテーブルのリストは以下のようなことができます:

PrivateMessages 
MessageReplies 

PrivateMessagesテーブルことができますこの方法では、ユーザーが自分の受信したメッセージをチェックしたい場合、あなたは言ってテーブルを照会することができます親メッセージを格納し、その後MessageRepliesテーブルは後続の応答を格納することができます。 1つのテーブルにすべてを格納することができますが、トラフィックに応じて、おそらく1つのテーブルからすべてのメッセージと返信を取得するための再帰関数を記述することによって、2つのテーブルアプローチが簡単になります。

私があなただったら、私は鉛筆と紙で座り、自分のデータベースに記録したいものを書き留めておきます。そうすれば、あなたが保存したいものとの間にリンクを描き、どのように一緒に来るかを見ることができます。私が物事を視覚化しようとしているとき、それは私を助けます。

+0

それほど多くの素晴らしい答え。これは素晴らしいです。これはまさに私がやりたいことです。もし私ができるなら、私はあなたにすべての道を回したいと思います。 – Paul

0

ウェブアプリケーションの範囲については、複数のデータベースは必要ありません。ただし、データを効率的に格納するには、複数のテーブルが必要です。

ユーザ設定の場合は、必ず別のテーブルを使用してください。ユーザーがログインしようとするたびにアクセス(=検索)されるため、「メイン」ユーザーテーブルは可能な限りリーンにしてください。ストアID、ユーザー名、パスワード(ハッシュされたもの)認証時にアクセスする必要があります。すべての余分な情報を別のテーブルに入れてください。そうすれば、あなたのログインは小さいテーブルだけを照会し、ユーザーが認証されると、そのIDを使用してセカンダリテーブルから他のすべての情報を取得することができます。

メッセージの大きさがより大きいため、メッセージを扱うのが難しくなる可能性があります。ユーザーごとに数十または数百もある可能性があります。アプリケーションのロジックに基づいてテーブル構造を設計する必要があります。各ユーザーの表は明らかに実現可能な解決策ではないので、一般的なメッセージ表を参照してください。ただし、管理可能なサイズに維持する手順を実装してください。たとえば、X日より古いメッセージを「アーカイブ」すると、別のテーブルに移動されます(ユーザーが古いメッセージに頻繁にアクセスする可能性が低い場合はうまくいきます)。しかし、私が言ったように、それはあなたのアプリケーションに依存します。

幸運を祈る!

+0

2つの質問(偉大な回答のためにありがとう): 個別の設定テーブルをどのように識別するのですか?ユーザーIDまたはユーザー名 また、すべてが1つのテーブルの中に格納されている場合にメッセージを照会するために、ユーザーに応じて表示するメッセージを選択する良い方法は何でしょうか? SELECT * FROMメッセージのようなものWHERE username = '$ username'タイプのビジネス。 もう一度、すばらしい答えをいただきありがとうございます。 – Paul

+0

ユーザー名の代わりに常にIDを使用すると、検索がはるかに高速になります。だから、メインユーザテーブルには、ID、ユーザ名、パスワード(これが適切にハッシュされることがどれほど重要かを強調することはできません)+ログインに必要なその他のフィールドがあります。それからuser_id(ユーザーのID)とユーザー情報フィールドを持つユーザー情報テーブルがあります(おそらく)。ユーザー設定と同じです。メッセージは似ていますが、送信者と受信者の両方の列(ユーザー表のIDを指す)が必要であることを覚えておいてください。 –

+0

パスワードのハッシュを心配しないでください。私はmd5()でWebアプリケーションの開始以来それを実装しました。これは、このテーブルのパスワードを使って行うことだけです。それは送信者/受信者の列に言及すると面白いです - 私はちょうどその方法の実装を計画していた。 _本当に、この中の助けてくれてありがとう。私はあなたのような有益な人がいなければそれをすることができませんでした – Paul

0

Cristian Raduのコメントに沿って、データを別のテーブルに分割する必要があります。リーンユーザテーブルには、実際にはユーザごとに1つの一意のIDが必要です。この(ユニークな)キーは、セカンダリテーブルで繰り返される必要があります。それは外部キーと呼ばれます。明らかに、ユニークなキーが必要です。ユーザー名が一意であることが保証されている場合(つまり、メールアドレスでユーザーを識別する必要がある場合)、そのユーザー名を使用できます。ユーザー名が実名(Firstname Sirnameなど)である場合、その保証はなく、ユーザーIDを自分の鍵とする必要があります。同様に、あなたの投稿を含むテーブルは、誰がそれを書いたのかを示すユニークなユーザIDを持つフィールドを持つことができます(ただし必須ではありません)。

データベースの設計と正規化の概念について少しお読みください://dev.mysql.com/tech-resources/articles/intro-to-normalization.html)正規表現のn番目の形式ではうんざりする必要はありませんが、この段階では、データベース設計を行う。

幸運と;-)

+0

これは素晴らしいことです。私は本当に本当に私はあなたの人を代理することができたらいいと思う。私の場合、私は一意のユーザー名を持っていますが、実際には未使用の自動増分ID番号を持っています。あなたが話した外部キ​​ーの場合、自動増分整数IDまたはより複雑なユーザー名を使用することが望ましいでしょうか? – Paul

+0

自動インクリメントIDはキーにとって問題ありません。これは、一意性を保証する利点があります。ただし、通常はテーブル内に冗長な情報が表示されないようにすることをお勧めします(これは、データベースの正規化時に満たされる要件の1つです)。あなたのケースでは、私はあまり心配しないでしょう - あなたのデータベースサーバーはどちらかの方法とパフォーマンスに気を付けるつもりはない、またはデータ量は考慮されません。 – DrSAR

関連する問題