web-dev-qa-db-ja.com

パブリックIDをモデル化する方法は?

新しいプロジェクトのアーキテクチャを作成している間、私はパブリックIDを処理するための優れたソリューションを考え出すのに苦労しています。たとえば、ユーザーは会員カードを受け取ります。各カードには会員証が印刷されています。ただし、私たちの業界では他のビジネスとの協力が期待されているため、これらのメンバーシップIDの形式は将来変更される可能性があります。または、追加のIDを使用します。

確かに、メンバーシップIDは内部データベースの主キーなどではありません。

これらは私が思いついた2つのオプションです:

  • メンバーシップIDは、ユーザーモデルのプロパティです。
    • クエリは簡単です。
    • ただし、新しいフォーマットが作成されるたびに、モデルとデータベーススキーマを変更する必要があります。
  • メンバーシップIDには、ユーザーモデルを参照する独自のモデルがあります
    • これは簡単に拡張できます。
    • しかし、それから、私たちは(多かれ少なかれ)各クエリのために2つのテーブルを結合する必要があります

この質問がすべてのことを簡単に言うと、多くの要因に強く依存しますが、この種の柔軟性を明示的にモデル化するのではなく、データベーススキーマの変更を期待することは悪い習慣です。これは数年に1回だけ起こるということです。

それとも他にアイデアはありますか?

6
Obenland

あなたは未来を見ることはできません-それを受け入れてください。そのため、今日の場合は単純ですが十分なソリューションを先に進め、要件を事前に把握しておかないと、複雑さが増します。

「数年に1回」発生することが予想されるものに設計の労力をかけすぎ、そのときの正確な要件がどのようになるかまだわからない場合、それらの設計を過剰に設計するリスクが高くなります。さらに悪いことに、それらの未知の将来の要件を追加することを実際に困難にする何かを設計するリスクが高くなります。

したがって、メンバーシップIDをユーザーの属性として、自由形式の文字列として設計でき、これで今日はこれで十分である場合は、先に進んでください。数年で本当に「モデルとデータベーススキーマを変更する必要がある」場合-残念ながらそれを実行すると、それは世界の終わりではなく、多少の努力が必要になるかもしれませんが、このため、システムを破棄してゼロから始めます。

たぶん、形式が変わってもデータベーススキーマのユーザー属性で十分であり、アプリケーションの一部の検証ルールを変更するだけで済みます。多分それは必要な2番目の会員IDがあることが判明した。メンバーシップIDにタイムスタンプが必要であるか、結合されたIDに分割する必要があるか、外部システムからのデータと一致する必要があるか、ID生成が分散化されている必要があることが判明するか、そうでない場合もう必要ないです誰が知っていますか考えられるすべての「たぶん」に対応するシステムを設計することはできないので、自分で試してみてください。

16
Doc Brown

あなたが正しい;メンバーシップIDは、主キーのではありません。それが合成キーが存在する理由です。

合成キーは、ユーザーまたはデータベースによって自動的に生成されるキーです。これは通常、増分する番号またはグローバルに一意の識別子の形式をとります。レコードが削除されても、合成キーは決して再利用されません。優れたものは、データベース全体で、または任意のデータベースでさえも一意であることが保証されています。

合成キーは、それらが表すデータの特性を一切受けません。実際には、他のテーブルの外部キーと照合することによってそれらが与える関係を除いて、データから完全に独立しています。

つまり、合成キーは、他の種類のキーが抱える問題に悩まされることはありません。各テーブルには、合成の主キーと、それらのキーを他のテーブルの対応する外部キーに結合することによって定義された関係が含まれている必要があります。

当然、メンバーシップIDなどの他のフィールドを追加できます。ただし、アドホッククエリの結合として使用する場合を除いて、テーブルのリレーションシップでこれらのフィールドを使用しないでください。

データベーススキーマの変更は行われますが、通常は新しいビジネス要件に応じてのみ行われます。本番データベースに加えられる最も一般的な変更は、テーブルまたはフィールドが追加されることです。

9
Robert Harvey

この場合の良い/悪い習慣に関しては、それはアプリケーションとデータに関する要因に依存するため、主に主観的です。

たとえば、最初の製品発売で1つのビジネスしかなく、他のビジネスを追加するスケジュールや計画がない場合は、他のビジネスの会計に適合する設計を考え出す必要はありません。

複数を計画しようとする際に、いくつかの追加のビジネスが元のビジネスと同じメンバーの概念を持っていない可能性があります。このルートには、ビジネス "B"からのリクエストに基づいてメンバーの機能を変更するなど、他の落とし穴があります。ビジネス "A"には、予期しないまたは削除されないメンバー機能があります。 (最初のオプションは、例のシナリオになる可能性が高くなります)

2番目のオプションの場合、それは機能する可能性がありますが、これは新しいプロジェクトになるはずなので、まだためらっています。共有される機能/プロパティの決定には、いくつかの困難があります。実装によっては、各メンバー/ビジネス全体でコードを複製したり、機能をマスキングしたりする機会が増えます。

新しいビジネスを追加するための「すべて」の要件があったとしましょう。

このプロジェクトまたはお住まいの地域の他のプロジェクトがメンバーIDを決定すると仮定すると、メンバーIDが内部と外部で同じであっても意味がありません。がメンバーIDの内容に基づく機能である場合、その機能は壊れる可能性があります(例:履歴レコード、または変更の前後の日付にまたがるレコードを処理できない)

通常、何らかの形式の内部IDと外部IDが必要になります。あなたの場合、あなたは{Internal Id:1234;ビジネスA外部ID:M001。ビジネスB外部ID:UM001; }。メンバーごとまたはビジネスごとにかなり大量のエントリがある場合を除き、複数のテーブルを結合してもパフォーマンスに大きな影響はありません。

3
eparham7861