2016-09-23 10 views
1

まず、私は私の質問には非常に正確でみましょう:自動MySQLのテーブル作成、[ユーザーコントロール]

は基本的に私はPHPを勉強し、MySQLはとても自分自身のために少しプロジェクトに取り組んで。私は私とお友達のために私たちがお金を追跡することができるウェブサイトを作成しています。特に、数ヶ月に渡って返される必要がある大きな金額です。だから私たちの誰もがこのレコードに名前を与える「レコード」を始めることができます。 'Car Expenses'を選択すると、その大きな金額の借り手から返金されるたびに、このレコードにトランザクションを追加できます。この 'Car expenses'レコードには、明らかにトランザクションID、返された金額、日付などの列が含まれます(このビットに戻ってきます)。

私は間違いなく2つのテーブルが必要であることを知っています: 1)USERS - ユーザーの名前と電子メールアドレスがすべて私たちのために保存されています。 2)レコード - すべてのレコードの要約(ただし、レコードに関する取引の詳細は含まれません)が保存されます。レコードのタイトル、レコードの説明、作成時刻、最終更新日時、関係者の名前など

しかし、問題は、システムの3番目の部分がどのように動作するかわかりませんレコード上のすべてのトランザクションを表示するための特定のレコードの詳細に移動します。どのくらいのお金がすでに支払われているか、どのような日付になっていますか。

ユーザーが作成した個々のレコードごとに新しいテーブルを作成することを考えていました。 このテーブルでは、トランザクションID、取引日付、マネーイン/アウト、コメント、および取引の編集/削除のためのコントロールが実行されます。

私の見解では、この方法(毎回新しいテーブルを作成する)の問題は、新しく作成された各テーブルにユーザ定義の名前を付けることは難しいでしょうし、レコードが非常に困難になる可能性があります。

システムのこの3番目の部分を実装するための最良の方法、または私のウェブサイトの全体的なデータベース設計のためのより良いアイデアを教えてください。非常に前もってありがとう。

+0

各レコードに新しいテーブルは必要ありませんが、ユーザーIDとレコードIDを参照するすべてのレコードに対して1つのテーブルが必要です。 – aynber

+0

aynberありがとうございました、私はそれが同じテーブル内の1つのレコードからトランザクションを選択し、誰からもたくさんのトランザクションがどこにあるのかを表示することは複雑だと思った – Ros

+0

user_idsとrecord_idsと正しいインデックスそれは追跡するのが難しくありません。実際には、各レコードへのリンクを含むトータル・トランザクションを表示したい場合は、おそらく簡単になります。 – aynber

答えて

0

一般的に、データベースにはあまりにも多くのテーブルを持ちたいとは限りません。スペースを取るだけでなく、そこからクエリを実行することは不可能です。

あなたが代わりに行うべきことは、列挙した列を持つすべてのトランザクションに対して別個の表を作成することですが、トランザクションが属するユーザーのIDを保持する追加の列を作成することです。これにより、JOINコマンドを使用して簡単に問い合わせることができます。

+0

Hex37ありがとう、私は、将来的に(家族や友人の知っている人)、さらに多くのユーザーがいると思っています。 – Ros

+0

SQLについてはほとんど心配する必要はありません。そのスクリプト言語でのテーブル検索は非常に効率的です。コーディング言語のほとんどの部分です。多くの場合、数十万行のテーブルでは、最も古いエントリのアーカイブテーブルを作成する必要があります。 – Hex37

+0

非常に洗練されていただきありがとうございます。 テーブルが限界に達し、アーカイブテーブルで分割する必要がある場合、アーカイブテーブルから同じ方法でクエリできますか? – Ros

0

シンプルで一貫性のあるスキーマを作成して、システム内のさまざまな要素(ユーザーとエクスチェンジ)を表す必要があります。一般に「トランザクション」のような予約されたキーワードの使用を避けたいので、名前を選ぶのは難しいことがあります。

お金の交換ごとに新しいテーブルを作成することは絶対に間違っています。リレーショナルデータベースの全体のポイントは、同じテーブルに格納された多数のレコードを他のレコードと単純な関係にすることです。例えば、交換機は、それぞれの「ユーザ」レコード識別子によって送信者と受信者の両方を参照する。簡単に言えば

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, 
    name VARCHAR(255), 
    created_at DATETIME 
); 

CREATE TABLE exchanges (
    id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, 
    amount NUMERIC(12,2) NOT NULL, 
    sender_user_id INT, 
    recipient_user_id INT, 
    created_at DATETIME 
); 

は、これは非常に単純なアプローチです。より堅牢なソリューションでは、ledger structureを使用します。交換は、アカウント間の2つの関連した独立した転送に分類されます。今

あなたが負ってバランスを知りたい場合は:

SELECT sender_user_id, SUM(amount) FROM exchanges 
    WHERE recipient_user_id=? 
    GROUP BY sender_user_id 

彼らは負っているどのくらいのお金受信者ごとにあなたが表示されます。あなたが負の金額として "返済する"ことを表す限り、値はゼロになるはずです。元帳はこの仕事をより良くします。

+0

本当にこのような詳細な返事をいただければ幸いです。私は既に15〜20分のLOLでこれを完成させています。私が第3のレコード(サマリー)テーブルを追加した理由は、ユーザーのダッシュボード上に、それらの一部であるすべてのレコードを(小さなカードでもよい)表示したいからです。 – Ros

+0

デベロッパーとしてのキャリア上で、このような元帳システムを何度も作成するように求められます。 10回目までには日常的になります。初めて目まぐるしく複雑になりました。要約レコードは頻繁に同期しなくなり、少量のデータに対しては、信頼性の低い要約レコードよりも速い「SUM()」が優れています。 – tadman

+0

いいね!元帳システムを間違いなく見ていきます。あなたの時間と恥をもう一度おねがいします。初心者のために投稿のいずれかに親指を当てることはできません。 – Ros

関連する問題