デザインデータベースモデル - バージョン履歴とデザイン

企業データベースの設計では、多くの場合、需要が発生した操作を保存する前に、それはデータを期待され、どのようなデータを操作した後、運転データの前にあるものを見ることができます。この需要のために、我々は維持または達成するためのバージョンを使用する過去のデータを使用することができます。

、デザインのバージョンでは、以下のプログラムを過去のデータを保持できるようにするために:

 

まず、バージョン番号

バージョン番号は、このフィールドは、日時型であってもよい、上記履歴データテーブルを保持するためにバージョン番号フィールドに増加させる、それがint型、すべてのデータ操作することができ、設計の一般的なバージョンで作成することです新しいバージョンは、バージョンだけでこれだけあなたは、最新のビジネスデータを取得することができ、最大バージョン番号を取得する必要があり、上昇しています。

履歴データを保持するために使用することができるバージョン番号に加えて、同時編集を回避する機能があります。例えば、我々は、オブジェクトAは、現在のバージョンは1であると同時に、オブジェクト、データ変更の編集ページを開くには、二人のユーザーを持っています。変更をコミットするには、最初のユーザーの新バージョン、今回のシステムIDおよびオブジェクトクエリのバージョンとデータの最新バージョンを変更することが判明するので、正常に変更さ1で、A 2オブジェクトを保存しました。この時間、ユーザBも変更を提出します。IDシステムとバージョン1のクエリオブジェクト、変更するデータの最新バージョンを見つける2で、要件を満たしていないので、ユーザBのを修正することを拒否しました。ユーザー・インターフェースBは、リフレッシュ最新のバージョン2を入手し、それを修正します。

ID シングルナンバー お金 版数
1 EXP123 100 1

バージョン番号の場合には、書類の量は、新しいバージョン2バージョンを作成するように変更します:

ID シングルナンバー お金 版数
1 EXP123 100 1
2 EXP123 120 2

第二に、力の使用、故障時間

保存する2番目の方法は、効果のバージョンを取るために、故障時間を示すために、過去のデータを使用することです。過去のデータレコードテーブル「有効な時間」「デッドタイムを増やすには、」2つのフィールドは、2つのフィールドが空で許可されていません。作成したデータの場合は、有効にするには、データの時間を作成することで、デッドタイムは9999-12-31です。新しいデータを作成しながら、今、これらのデータが変更されている、そして我々は唯一、有効期限のバージョンに現在の時刻を設定する必要があり、効果的な時間は現在の時間で、故障までの時間は9999-12-31にあります。

ID シングルナンバー お金 効果的な時間 故障時間
1 EXP123 100 2013年9月1日夜3時30分00秒 9999/12/31午後11時59分59秒

例えば、以下のように文書上に2013年9月1日は、後で2013年9月9日15:00:00でそのドキュメントを変更作成され、100から120に修正保存するときに作成量は、新しいデータです。

ID シングルナンバー お金 効果的な時間 故障時間
1 EXP123 100 2013年9月1日夜3時30分00秒 2013年9月9日午後三時00分00秒
2 EXP123 120 2013年9月9日午後三時00分00秒 9999/12/31午後11時59分59秒

有効期限の後、私たちは、クエリに渡すことに時間を必要とし、その後、効果的な時間と時間の間に障害が発生し、任意の時点で、データベース内のデータの値を照会することができ、力を使用してください。

どちらも、特定のサービスのデータを識別するために、自然キーを使用する前に必要です。私たちは、エンティティを記録したい場合には明確な「単一番号」、行う方法の「注文番号」自然キーの種類ではありませんか?自然キーとしてデータを作成するときに私たちは、データベースの主キーを使用することができます。

従業員のID フルネーム 誕生日 ビジネスID 版数
1 ジョー・スミス 1984年12月29日 1 1

たとえば、私たちは、従業員について、記録する基本的な情報、あなたは従業員ジョー・スミス、第1のデータを作成するとき、それはビジネスのIDもIDデータベース内の1に設定されていることができ、スタッフのテーブルを持っています。次に、Johnのプロパティの変更は、それがその主キー「社員ID」に変更されますの新しいバージョンを作成し、バージョンを記録しますが、自然キー「ビジネスID」は変更されません、常に1です。

従業員のID フルネーム 誕生日 ビジネスID 版数
1 ジョー・スミス 1984年12月29日 1 1
2 ジョー・スミス 1985年1月9日 1 2

過去のデータを記録するだけでなくできるものの、前の二つのプログラムを使用しますが、各修正データが保存された新世代のバージョンにつながるので、IDの各バージョンが新しいものであるので、ここでエンティティを識別するために、自然なキーが存在しなければなりません「ワンナンバー」の2つの例は、その自然キーです。各オブジェクトは、新しいバージョンを生成するために関連付けられているように、連鎖反応を形成するように、関連するすべてのオブジェクトを変更する必要ように主キーを変更します。たとえば、私たちはオーダーシステムを持って、受注テーブルと受注明細テーブルがあります。今、私たちはとても効果的な時間と時間の有効性を高め、バージョン履歴を記録するために変更し、自然なキーとして注文番号を使用する必要があります。今順序Aはあなたが順序を変更する場合は、1属性の内訳は、全体の順序の変更が生じ、修正する、100人の詳細の下に、そこにある、そして我々は、マスターキーが変化するため、新たに注文データラインを作成する必要がありますその注文の詳細は変更する必要があるので、100点の詳細は​​、新しいバージョン、注文の詳細の新バージョン、注文データの新しいバージョンのIDを指して「注文ID」を作成する必要があります。

画像

この設計上の問題を1000注文の詳細がある場合、私たちは、それ自体が注文の詳細を変更しないための属性を変更、拡大を加速しますOrder Detailsテーブルによって引き起こされ、また、この1000の詳細はコピーを行う起こし、その後、保存することができます。どのようにそれを行うには?我々は、次のアプローチを使用することができます。

1.ご注文の詳細は、注文の詳細ではなく、受注までの粒度のバージョンをバージョンフィールドを確立します。注文と注文の詳細は、データベースレベルの外部キー関係では存在しない、唯一の外部キーリレーションシップ・サービス・レベルがあります。故障時以外の有効タイムスケジュールを、増加するだけでなく、この分野では、「注文番号」、の順に属しているテーブルの詳細の名前を向上させるためのもの。

画像

オブジェクトが変更されるのであれば、我々は順序を変更し、注文の詳細が変更されていない(このようなビットに受信者情報を変更すると)、あなただけのOrdersテーブル内のデータの新しい行を生成する必要があり、注文の詳細をコピーして、新しいデータを生成しません。我々は、特定の注文の詳細にある場合は、変更(比調整単価、数量)は、あなたが唯一の注文全体のすべての詳細を変更することなく変更を行う具体的な詳細についてはピースオーダーを変更する必要があります。

この設計を使用した後、注文とその詳細を確認し、あなたを濾過失敗した時の発効のための2つのテーブルを実行し、注文番号の詳細は介して取得ではなく、注文IDでピックアップして取得する必要があります。

ときに注文の詳細に至るまでのバージョン管理粒度は、ロジック・デーモンがより複雑になります。ユーザーインターフェースOrderオブジェクトで操作される、システム全体の順序後のオブジェクトは、背景を変更するために広がっていく、バックグラウンドプログラムは、各品目のために比較される必要があり、あなたがラインアイテムが変更されている見つけた場合、それはコールの注文の新しいバージョンを生成します。方法の詳細。

2.個別の履歴テーブルを使用します

これは、バージョンの歴史的な記録を達成するための別の方法であります:

第三に、個別の履歴テーブルを使用します

実際に(もちろん、あなたはまた、追加のバージョン履歴情報を記録するために複数のフィールドを追加することができます)を正確にスキーマのテーブルを確立している履歴テーブルを使用して、テーブルには、データのみの履歴バージョンを保持します。それは一種のアーカイブ・ロジックのように、私たちが考えるすべての歴史のバージョンが頻繁にアクセスするべきではない、すべてが発効の既存のバージョン用に別のテーブルに投げ込ますることができます、それは必要性から、その後、歴史的なバージョンを照会する場合は、元のテーブルに残っています履歴テーブルのクエリ。

別の履歴テーブルには、次のような利点を持って使用します。

  • データトラフィック履歴データテーブルの量は、レコードや拡張を解放しません。履歴データを別のテーブルに記録されているため、そのビジネス・データ・テーブルのレコードだけがデータのコピー。
  • スキーマのビジネスデータシートは、調整、追加のバージョンフィールドを必要としません。スキーマは、元のデータテーブルを変更していないので、元のクエリのロジックを変更していないため。既存のデータベース設計のために、過去のデータの追加が簡単にログイン中。
  • 直接データテーブル更新操作をサービスすることができる、新しいIDを生成しません。IDは変わらないので、と私たちは自然の主要なアプリケーション・ロジックを適用する必要があります。

履歴テーブルのバージョンを使用する場合、各データ操作、最初履歴テーブルのトレース、およびデータ操作を実行するように改変することが操作(追加、削除、修正)の履歴データ方法を記録するために主にあります。他の別のテーブル内の履歴データので、SQLは同じではないために、改変されるべき機能の過去のバージョンを照会することです。もちろん、我々はまた、履歴テーブルのすべてを保持するデータベースの歴史的バージョンを作成することができます。

オリジナル住所ます。https://www.cnblogs.com/studyzy/p/3310266.html

企業データベースの設計では、多くの場合、需要が発生した操作を保存する前に、それはデータを期待され、どのようなデータを操作した後、運転データの前にあるものを見ることができます。この需要のために、我々は維持または達成するためのバージョンを使用する過去のデータを使用することができます。

、デザインのバージョンでは、以下のプログラムを過去のデータを保持できるようにするために:

 

まず、バージョン番号

バージョン番号は、このフィールドは、日時型であってもよい、上記履歴データテーブルを保持するためにバージョン番号フィールドに増加させる、それがint型、すべてのデータ操作することができ、設計の一般的なバージョンで作成することです新しいバージョンは、バージョンだけでこれだけあなたは、最新のビジネスデータを取得することができ、最大バージョン番号を取得する必要があり、上昇しています。

履歴データを保持するために使用することができるバージョン番号に加えて、同時編集を回避する機能があります。例えば、我々は、オブジェクトAは、現在のバージョンは1であると同時に、オブジェクト、データ変更の編集ページを開くには、二人のユーザーを持っています。変更をコミットするには、最初のユーザーの新バージョン、今回のシステムIDおよびオブジェクトクエリのバージョンとデータの最新バージョンを変更することが判明するので、正常に変更さ1で、A 2オブジェクトを保存しました。この時間、ユーザBも変更を提出します。IDシステムとバージョン1のクエリオブジェクト、変更するデータの最新バージョンを見つける2で、要件を満たしていないので、ユーザBのを修正することを拒否しました。ユーザー・インターフェースBは、リフレッシュ最新のバージョン2を入手し、それを修正します。

ID シングルナンバー お金 版数
1 EXP123 100 1

バージョン番号の場合には、書類の量は、新しいバージョン2バージョンを作成するように変更します:

ID シングルナンバー お金 版数
1 EXP123 100 1
2 EXP123 120 2

第二に、力の使用、故障時間

保存する2番目の方法は、効果のバージョンを取るために、故障時間を示すために、過去のデータを使用することです。過去のデータレコードテーブル「有効な時間」「デッドタイムを増やすには、」2つのフィールドは、2つのフィールドが空で許可されていません。作成したデータの場合は、有効にするには、データの時間を作成することで、デッドタイムは9999-12-31です。新しいデータを作成しながら、今、これらのデータが変更されている、そして我々は唯一、有効期限のバージョンに現在の時刻を設定する必要があり、効果的な時間は現在の時間で、故障までの時間は9999-12-31にあります。

ID シングルナンバー お金 効果的な時間 故障時間
1 EXP123 100 2013年9月1日夜3時30分00秒 9999/12/31午後11時59分59秒

例えば、以下のように文書上に2013年9月1日は、後で2013年9月9日15:00:00でそのドキュメントを変更作成され、100から120に修正保存するときに作成量は、新しいデータです。

ID シングルナンバー お金 効果的な時間 故障時間
1 EXP123 100 2013年9月1日夜3時30分00秒 2013年9月9日午後三時00分00秒
2 EXP123 120 2013年9月9日午後三時00分00秒 9999/12/31午後11時59分59秒

有効期限の後、私たちは、クエリに渡すことに時間を必要とし、その後、効果的な時間と時間の間に障害が発生し、任意の時点で、データベース内のデータの値を照会することができ、力を使用してください。

どちらも、特定のサービスのデータを識別するために、自然キーを使用する前に必要です。私たちは、エンティティを記録したい場合には明確な「単一番号」、行う方法の「注文番号」自然キーの種類ではありませんか?自然キーとしてデータを作成するときに私たちは、データベースの主キーを使用することができます。

従業員のID フルネーム 誕生日 ビジネスID 版数
1 ジョー・スミス 1984年12月29日 1 1

たとえば、私たちは、従業員について、記録する基本的な情報、あなたは従業員ジョー・スミス、第1のデータを作成するとき、それはビジネスのIDもIDデータベース内の1に設定されていることができ、スタッフのテーブルを持っています。次に、Johnのプロパティの変更は、それがその主キー「社員ID」に変更されますの新しいバージョンを作成し、バージョンを記録しますが、自然キー「ビジネスID」は変更されません、常に1です。

従業員のID フルネーム 誕生日 ビジネスID 版数
1 ジョー・スミス 1984年12月29日 1 1
2 ジョー・スミス 1985年1月9日 1 2

使用前面两个方案虽然能够很好的记录历史数据,但是每次修改数据都会导致新版本生成保存,所以每个版本的ID都是新的,所以必须有一个业务主键来标识一个实体,这里的两个例子“单号”就是其业务主键。主键的变动使得所有关联的对象都得变动,从而形成连锁效应,使得各个关联的对象也生成新的版本。比如我们有个订单系统,里面有订单表和订单明细表。现在我们要对订单的修改记录历史版本,所以增加了生效时间和实效时间,并使用订单号作为业务主键。现在有一个订单A,下面有100条明细,如果要对订单进行修改,将某一条明细的属性进行修改,从而导致整个订单的变化,那么我们就需要创建新的订单数据行,由于主键变动,所以订单明细都需要变动,所以100条明细都需要创建新的版本,新版本的订单明细中,“订单ID”指向了新的版本的订单数据的ID。

画像

这样的设计造成的问题就是订单明细表会极速膨胀,如果一个订单有1000条明细,我们只是修改了订单本身的属性,并不修改订单明细,也会造成对这1000条明细做Copy,然后保存。那怎么办呢?我们可以使用以下办法:

1.对订单明细建立版本字段,将版本的粒度细化到订单明细,而不是订单。订单与订单明细不存在数据库级的外键关系,只存在业务级的外键关系。也就是说订单明细表中增加生效时间、失效时间之外,还需要增加“订单号”这个字段,用于表名该明细是属于哪个订单的。

画像

我们这么修改后,如果订单对象进行了修改,订单明细没有修改(比如改了一下收件人信息),那么只需要在订单表中生成新的一行数据,订单明细不会Copy生成新的数据。如果我们对某一条订单明细进行了更改(比调整了单价、数量)那么只需要对具体修改的那条订单明细进行更改,而不需要对整个订单的所有明细进行更改。

使用这种设计后,查询订单及其明细,需要对两个表执行生效失效时间的过滤,而且明细的获取是通过订单号去取,而不是通过订单ID去取。

ときに注文の詳細に至るまでのバージョン管理粒度は、ロジック・デーモンがより複雑になります。ユーザーインターフェースOrderオブジェクトで操作される、システム全体の順序後のオブジェクトは、背景を変更するために広がっていく、バックグラウンドプログラムは、各品目のために比較される必要があり、あなたがラインアイテムが変更されている見つけた場合、それはコールの注文の新しいバージョンを生成します。方法の詳細。

2.個別の履歴テーブルを使用します

これは、バージョンの歴史的な記録を達成するための別の方法であります:

第三に、個別の履歴テーブルを使用します

実際に(もちろん、あなたはまた、追加のバージョン履歴情報を記録するために複数のフィールドを追加することができます)を正確にスキーマのテーブルを確立している履歴テーブルを使用して、テーブルには、データのみの履歴バージョンを保持します。それは一種のアーカイブ・ロジックのように、私たちが考えるすべての歴史のバージョンが頻繁にアクセスするべきではない、すべてが発効の既存のバージョン用に別のテーブルに投げ込ますることができます、それは必要性から、その後、歴史的なバージョンを照会する場合は、元のテーブルに残っています履歴テーブルのクエリ。

別の履歴テーブルには、次のような利点を持って使用します。

  • データトラフィック履歴データテーブルの量は、レコードや拡張を解放しません。履歴データを別のテーブルに記録されているため、そのビジネス・データ・テーブルのレコードだけがデータのコピー。
  • スキーマのビジネスデータシートは、調整、追加のバージョンフィールドを必要としません。スキーマは、元のデータテーブルを変更していないので、元のクエリのロジックを変更していないため。既存のデータベース設計のために、過去のデータの追加が簡単にログイン中。
  • 直接データテーブル更新操作をサービスすることができる、新しいIDを生成しません。IDは変わらないので、と私たちは自然の主要なアプリケーション・ロジックを適用する必要があります。

履歴テーブルのバージョンを使用する場合、各データ操作、最初履歴テーブルのトレース、およびデータ操作を実行するように改変することが操作(追加、削除、修正)の履歴データ方法を記録するために主にあります。他の別のテーブル内の履歴データので、SQLは同じではないために、改変されるべき機能の過去のバージョンを照会することです。もちろん、我々はまた、履歴テーブルのすべてを保持するデータベースの歴史的バージョンを作成することができます。

オリジナル住所ます。https://www.cnblogs.com/studyzy/p/3310266.html

おすすめ

転載: www.cnblogs.com/jpfss/p/11424596.html