2010-12-14 12 views
3

私は重量挙げとカロリーを追跡するウェブサイトを設計しています。以前は自分のデータベースを設計したことはありませんでした。私が終わったと思うたびに、私はそれが完璧ではないことが気になる。私はMySQL Workbenchでそれを概観しましたが、まだいくつか質問があります。データベースはどのように「完璧」でなければなりませんか?

  • データベースを手にとって "完璧"にすることの重要度はどれですか?どのようにして データベースを再構築するのは難しいですか? ?
  • エンジンオプションの機能は何ですか?右 すべてのテーブルはデフォルトで InnoDBエンジンですか?これに関する問題?
  • データの後にdataypesが変更可能ですか?おそらくVARCHAR からINTにはなりませんが、VARCHAR(45)から VARCHAR(255)はどうでしょうか?
  • 正常な設計のためにHAVE〜 に従う基本的なデータベースルールは何ですか?

私はERM図を添付しました。誰かが明らかな不正を指摘できれば、それは非常に高く評価されます。

alt text

+0

可読性のある場所に図を投稿できますか? –

+2

@タイラー:画像を右クリックして直接開きます。それは完全に読める。 –

+1

それを右クリックして表示するのは難しくありません - > http://i.imgur.com/Wz9GZ.png – Latox

答えて

12

あなたがそれを作ることができるように完璧な状態にして、必要なだけ不完全にしてください。

+1

:-)だけではその最後の文のためにあなたの担当者のためにたまにはいくつかの尊厳を売ると間違って何も+1を与えないだろう。私のほかに2つのアップ投票!あなたは私に借りている20;)(そして最も投票された答え!) – Trufa

+0

@Akinator:Heh、yeah。あなたは、私がこれを投稿したあなたの提案が、私をあなたに代理人として渡したことに気付かなかった。再度、感謝します。 ;) – AgentConundrum

+0

私はこの答が受け入れられます。 :) – Trufa

0
  1. 私は、任意のデータベースが完全であることを疑います。完璧を財の敵にさせないでください。
  2. InnoDBは外部キーに対して参照整合性を強制します。
  3. 任意のALTERを実行できますが、テーブルに加えてデータを変更する必要があります。
  4. 正規化ルール、適切な索引付けの慣行(例:WHERE句ごとに1つ)などを遵守する必要があります。
+1

#4に追加するだけです...正規化は素晴らしく、長期的には役立ちますが、スピードが完全に正規化されたデータベースで問題になることがあります。また、非正規化は非常に時間がかかります。 –

+0

良い点、マシュー。よく書かれた – duffymo

+1

@Mathew - 少し早まった非正規化はあなたのシステムを準最適なデザインにロックすることができます! –

1

あなたのexerciseテーブルを除いて、それはかなりよく見えます。 secondary1secondary10フィールドは、おそらく別のテーブルにあるはずのものです。しかし、あなたは他のすべての場所でうまくやっているので、、おそらくこれは意味がありますか?それについて考えて、確かめてください。

完全性は問題ではありません。完了した後で変更することができます(また変更されます)。可能な限り標準化を試みてください(ほとんどこれをすでにやっています)。フィールドサイズは変更できますが、それは心配しないでください。

+0

最初の正規形を壊します。エクササイズはセカンダリと1対多でなければなりません。 – duffymo

3

実用的なデータベースはありません。彼らはすべて疣贅を持っています。

データベースを使用する大きな利点の1つは、将来の変更に耐えるように構築できることです。たとえば、データの更新やデータの追加にストアドプロシージャを使用します。テーブルが最終的に分割されると、外部ソフトウェアに必要な目に見える影響がなく、ストアドプロシージャを変更することができます。

デザインが完璧になるまで待っていれば、何か便利なものを実装することは決してありません。

+1

は実際には、_my_データベースのすべてが完璧_are_、しかし、1を約束したとして、私は、 – paxdiablo

2

一般に、あなたのエンティティはうまくいくようにしようとしますが、フィールド、インデックスなどを追加することは事実ではありません。異なるカーディナリティをサポートするためにエンティティをリファクタリングする方がいくらか関与します。

一見して、いくつかのものが飛び出します... 1.あなたのエクササイズテーブルのすべての番号付きフィールド。巨大な赤旗。私はすぐにこれをリファクタリングします。 2.バッジ - >ユーザーバージュ。名前に固有の制約を適用していても、そのテーブル(ID)に対して新しいPKを作成します。 3. IDフィールドの名前を正規化するのに時間がかかります(つまり、Userでは 'userid'を使用しますが、食べ物では 'foodid'の代わりに 'id'を使用します)。どのように行くかは選択の問題ですが、一貫しているようにしてください。

0

あなたのデザインはかなりよく見えます!

ここで重要なことは、ユースケースとユーザーダイアログをスローして、すべてのフローが簡単にサポートされているかどうかを確認することです。

完璧なユーザーエクスペリエンスは、完璧なDBより重要です。

+2

James Anderson:「完璧なユーザーエクスペリエンスは完璧なDBよりも重要です」私は同意するとは言えません。理想的には、データベースとUXの両方を取得することが理想です。長期的には、悪いデータに関連するリスクとコストは一般に、サブスタンダードUXのコストよりもはるかに大きくなります。アプリケーションは、要件が変更されるか、アプリケーションが置き換えられるまで持続します。データはしばしばずっと長く続きます。データベースを正しく取得することは、UXの権利を得ることと同じくらい重要であり、ほとんどの場合、*もっと重要なことです。どちらの場合も、「完璧」は達成されるよりもしばしば志望されます。 – sqlvogel

+0

"完璧なユーザーエクスペリエンス"はおそらく達成可能ではありませんが、合理的なユーザーエクスペリエンスは合理的にエレガントな方法でビジネス/ユーザーの要件を満たすため、システムが目的に合っており、貧弱なデータモデルを問題にするためには、標準的なユーザーエクスペリエンスは、不完全なデータモデルが問題になるずっと前にシステムが置き換えられることを意味します。 –

+1

"合理的なユーザーエクスペリエンス"とは、システムが目的に合っているということですか? Yikes!データモデルを問題にするのに十分長く生き残ることは事実かもしれません。その時までに、良好なデータが回復不能に失われてしまい、結果的に訴訟や財政的損失に直面する可能性があります。貧弱なユーザーエクスペリエンスのために訴えられる可能性は非常に低いです。良いUXは確かに良いですが、良いデータはどんな組織の血でもあります。 – sqlvogel

1

すでに多くのアドバイスがあります。追加するポイントが2つ追加されます:

1 - 決してプレーンテキストでパスワードを保存しないでください。それを暗号化し、それを暗号的に安全なハッシュでハッシュし、salt/hashを格納します。

2 - 日付/時刻をUTCで保存し、プレゼンテーションレイヤーで希望のタイムゾーンに変換します。 (私はいつもunixのタイムスタンプとしてdatetimeを保存しますが、それは私の好みです.DMSTIMEには何も間違っていません)

完全にコミットする前にあなたのデザインをテストし、 。あなたのデザインを実際のmysqlデータベースにプッシュし、いくつかのquiresを書いて、あなたが望むすべての情報を追加して取得できることを確認してください。 quiresが機能したら、データベースをたくさん(数千から数百万のレコード)で読み込み、再度quiresを実行するスクリプトを書いてください。これはあなたのデザインをテストする最良の方法です。数百のレコードしかない場合は、ほとんどすべてのクエリが素早くなります。データベースが重大な問題に遭遇し、ラムに適合しなくなると、デザインやインデックスが意図された用途に最適化されているかどうかを確認することができます。

1

データベースの変更が予想されますが、それを管理する方法が問題です。少なくともBoyce-Codd/5th Normal Formを設計すると、設計時に組み込みのバイアスを回避し、必要な時にスキーマを容易に進化させることができます。

必要以上に多くのデザインを追加することに注意してください。スキーマをアプリケーションやそれを使用する他のデータ消費者より先に設計すると、あとで多くの変更を加える必要があります。可能であれば、YAGNI原則を適用し、Agileをプロジェクトに適用します。

開発中は、できるだけスキーマを制限することから始め、後で必要に応じてこれらの制限を緩和することが理にかなっています。たとえば、ビジネスルールが常に適用されるかどうかが分からない場合は、とにかくそれを適用する方がよいでしょう。制約を緩和したり、あとで何かをオプションにするのは簡単ですが、一旦依存コードが構築されると、コードが対応するように設計されていない新しいルールを実装するのがはるかに難しくなります。

"リファクタリング"という単語には注意してください。データベーススキーマの変更は、通常、データベースの意味と動作を変更します。アプリケーションの観点からはリファクタリングであるかもしれませんが、データベースに関しては、ほとんどのスキーマの変更は機能しない変更ではなく機能的です。

2

"完璧なSQLデータベース"の問題は、SQLには、特定のレベルを超えて「完璧なデータベース」を作る能力がないことです。

しかし、教師の意見を聞いて、Coddが誇りに思うようにしてください(3NF/BCNFなど)。悪いデータでいっぱいのデータベースを修正しようとするよりも、キャッシュや一時的な正規化されていないデータを後で追加する方が簡単です(パフォーマンス、必要なときなど)。データは愛を求めています。大好きです。ここで言われていること

は、私が指摘しますいくつかのものです:

  1. exercise、間違った間違った、間違って見える - secondary1、secondary2、secondaryN ...ないありがとう!私はこのようなスキーマを残しません!

  2. useridはPK(varchar)ですが、usernumberはintですか?再び、ありがとうございます。これは、他のテーブルと同じフォーマット(ほとんどはid)に従っているようには見えず、何かが正しくないかもしれないというヒントになるはずです。おそらく、userid(またはusername?)には一意の制約があるだけです(他の列にもインデックスを追加できます - 一般的にPKは単調に増加する値で "最もうまく機能しますが、DBには再インデックススケジュールも必要です)。

  3. 不一致命名(useridusernumberid)。結構です。あなたが選んだものは気にしませんが、一貫してください。

私のクイックレビュー。 ハッピーな発展。

+0

あなたは1番に何を提案しますか?セカンダリを別のテーブルに引き出しますか? – Juice

+0

@Luminoseはい - 任意のリストでは、関係の中で別のテーブルを使用する方が一般にはるかに優れています。しかし、 'AddressLine1'、 'AddressLine2'(多くの注文書に見られるようなもの)は完全に受け入れられます。違いは時々微妙ですが、それは存在します。私はそれが[異質な]タプルと同種のリストの違いだと思っています。 –

1

完璧は良いの敵です。平凡なものと悪いものはまた、善の敵でもあります。

他の人も言っているように、データを正規化する方法を学びます。少なくともBCNFまで。後で、正規化の規則を無視する時期を知ることができます。

もっと一般的には、データの関係モデルを学んでください。この点で優れたテキストがあります。初心者はCJ Dateを参照してください。最初のデータベースを構築するためにモデル全体を学ぶまで待ちません。

データのリレーショナルモデルは、同じデータのオブジェクトモデルと一致しないように見える結果につながることがよくあります。この不一致に対処する方法を学びます。

変更に対応してください。

関連する問題