デザイン論:何か良い方法を操作する番号物?[定休日]
-
08-06-2019 - |
質問
いざとくなります。私の議論は、どのような課題が重要になりまく答える。
私の中の設計アプリはこのようなポートフォリオ管理です。デザインしていく
- 問題点:問題を解決
- 【解決提案された解決策が一つ以上の問題
- 関係:関係の中で二つの問題は、ソリューション、または問題です。われる:
- 親-子どもに何らかの分類/ツリーの階層
- 重なりの程度液または二つの問題は本当に住所が同じコンセプト
- アドレスの程度の問題のアドレス解決
私の質問の時間に自然のことに頼もしく感じました。問題作の、そしてフェード動作をします。ソリューションは予想される決議日でも変更して開発されています。の関係が変化して問題とソリューション進化させます。
その質問:何が最高のデザインのためのバージョンのこれらのものだったので車両の現在と歴史的視点でのポートフォリオ?
降:ものを作っておくべきことを具体的な質問が@エリック-髭の答えを進める必要があるのです。
私は考える三つのデータベースのデザインです。まあそれぞれ自分の短所もあります。私の質問はを迎えるのですがう気が無くなるでしょうからですか?
1:問題とは別に、ソリューション)は自己参照にバージョン管理.
table problems
int id | string name | text description | datetime created_at | int previous_version_id
foreign key previous_version_id -> problems.id
この問題があがって新しいバージョンになって複製を行全体を含む長 description
カラムです。
2:新しい関係のタイプ:バージョン。
table problems
int id | string name | text description | datetime created_at
では、このメソッドは単純移動の関係から問題とソリューションテーブルの関係を表に示す。同様に複製問題もない"クリーナー"からすでに持ってい抽象的な関係概念です。
3:使Subversionのような構造移動全ての問題解決の属性を個別のテーブルとバージョンです。
table problems
int id
table attributes
int id | int thing_id | string thing_type | string name | string value | datetime created_at | int previous_version_id
foreign key (thing_id, thing_type) -> problems.id or solutions.id
foreign key previous_version_id -> attributes.id
このため負荷を現在のバージョンの問題またはソリューションしていますェットの全バージョンの属性選別している日付として用いる。このようなひどい。何がそう悪くはないでタイプ-チェックこれらの属性をデータベースです。その value
カラムは自由です。ますので、 name
カラムを参考個別 attribute_names
テーブルは type
カラムがない 力 正しいタイプの attributes
表に示す。
以降もの:対@エリック-髭のコマルチテーブルに外部キー:
悲しいかな、僕は単純に:いつもの問題およびナレッジソリューション。ってい9または10種類のものになってい9または10桁の外部キーを下りました。たいと思ったシングル-テーブルの継承が、もうちょっと共通することが 非常に 無駄ない組み合わせを一つの表に示す。
解決
Hmm音声のようなこのようなサイト...
このデータベースとしてデザインが、バージョン管理システムのようにSVN、必要はありません、実際には、更新、挿入します(バージョン番号)がうまくいかない時期を変更することで作られています。これMVCC、多値並行処理です。Wikiでも良い例です。
他のヒント
@Gaius
foreign key (thing_id, thing_type) -> problems.id or solutions.id
ご注意これらの種類の"角"外国の鍵となります。私の経験によって示されているクエリの性能が飛躍的にご参加条件はチェックの前に把握するテーブルに参加します。などの優雅ながnullable
problem_id and solution_id
仕事もかなり良くなったと思います。
もちろん、クエリー性能にもなるMVCCデザインにしたときの追加のチェック取得の最新バージョンです。のトレードオフの関係は、その必要はありませんの心配が競合と。
についてどう考えていますかこの:
テーブルの問題点
int id|string name|テキストの説明|datetime created_at
テーブルproblems_revisions
int改int id|string name|テキストの説明|datetime created_at
外国人idをキー->課題です。id
前に更新する行を追加で挿入し、改訂する。この追加挿入すが、しかし、これは何ださい
- 効率的なアクセスの現在のバージョン選択の問題は通常どおり
- スキーマでは直感的に実現したいモデル
- テーブル間の結合におススキーマに保つ効率的な
- を改訂数当事業の取引ができないバージョン管理テーブル上記のようにSVNは以上のファイルです。
思い
オプション4:のハイブリッド
移動に共通のもの属性を単一の-継承テーブルを追加 custom_attributes
表に示す。この外国人キープの重複を削減が可能です。な問題解決型の安全のための追加の属性です。またの追加を少し複雑であるという方法とっての属性です。
の場合 description
その他の大型分野にもテーブルのものでもない解決の重複-スペースの問題です。
table things
int id | int type | string name | text description | datetime created_at | other common fields...
foreign key type -> thing_types.id
table custom_attributes
int id | int thing_id | string name | string value
foreign key thing_id -> things.id
この選択データ構造が共通の質問のモデルです。れるいは現在の位置になっています。の際には、またドリルの歴史、特定の問題のソリューション。
このテーブルのための問題解決との関係を代表する現在の位置にします。その problem_history
, solution_history
, など。これらはその子テーブルの問題も含extraカラムのための VersionNumber
や EffectiveDate
.の鍵はProblemId
, VersionNumber
).
更新する際に問題というのは、古い価値の problem_history
表に示す。時点で問合せができるだけ取り出して problem_history
記録に有効などの特定の日です。
がってきたことをここの前、私はともに見合 problem
や problem_history
この時に役立つ各種お問い合わせ.
オプション1が困難となクエリの現状は、すべての歴史のあるデータの混合現在のデータです。
オプション3は悪いクエリーの性能や避コードに対するアクセスも行のために何をすべきだとする単純なクエリ。