自問自答する必要があります: データの正規化ルールを尊重するには、実際にどこまで行く必要がありますか?
テーブルに何が含まれるかはわかりませんが、それがMobile、Work、Home、iPhonePhoneTypes
のようなもののリストである場合、おそらくすでに少し行き過ぎているでしょう: あなたは連絡先アプリケーションを構築しているのではなく、構築していますペット シッティング アプリケーションの場合、おそらく開発時間を必要とするソフトウェアのより重要な領域があります。
ソフトウェアの複雑さを増すとコストがかかります。機能を実装するまでの時間が長くなる傾向があり、複雑さとともに、エラーのリスク、メンテナンスのコスト、そして多くの場合、パフォーマンスも低下します。
これらの連絡先の詳細は、実際にはお客様の所有物です。
顧客は、複数の電話番号と複数の緊急連絡先を持つことができます。
通常、これらは重要な順にリストする必要があるため、必要が生じた場合は、最も関連性の高い人に最初に電話します。
これ以上の情報がなければ、これを処理する方法は、アプリのユーザーが好きな方法でそのデータを入力できる Customer テーブルに 2 つのメモ フィールドを残すだけで、正しい順序でリストし、次のように注釈を付けることができます必要(月曜のみ、お客様のお母様、午前11時以降のみ、など)。
必要に応じて、データ入力をさらに制限することができます。たとえば、セミコンロンを使用するか、単にCrLf
レコードを分離することにより、フィールドにデータを追加する「追加」ボタンをクリックする前に、ユーザーが詳細を入力するテキストボックスを用意することができます。次に、データをセミコロンまたは CrLf で分割し、フォームのリストボックスに表示して、見やすくすることができます。
お客様の電話番号と緊急連絡先番号の両方を同じように扱うことができます。
これにより、物事が簡単になります。すべての顧客データは、複数のテーブルに分割されるのではなく、1 つのテーブルにあり、不要な結合がなく、複数のテーブルを使用するよりも多くのスペースを必要としません (実際には、スペースを節約できます)。レポートが簡単になり (顧客リストを表示するだけで、特別なことをしなくてもすべての顧客の利用可能な電話番号がすべて表示されます)、検索も簡単になります。
1 つのフィールドに複数の値を持つことは、周辺データでは非常に一般的です。
連絡先を分離し、連絡先に基づいて複雑なレポートを作成したり、連絡先を再利用できることを確認したりする必要がない限り、すべての情報に対してテーブルを作成する必要はありません。アプリケーションのユーザーが顧客に関連するものを入力できるようにします。
データ入力を制限してフォーマットし、必要に応じて一貫性をチェックしますが、最終的には、ソフトウェアの目的が複雑な連絡先リストを維持することでない限り、必要以上に難しくしないでください。少しの VBA といくつかの文字列操作でデータを制限し、ユーザーにとって最も関連性の高い順序で再配置できるようにするだけで十分です。複雑さを回避することで、アプリをよりスマートにします。
とにかく、単純なものから始めて、データを複数のテーブルに分割することが理にかなっているのかどうかを後で確認します。
時期尚早の最適化は避けてください。
ただし、これを本で本当に処理する必要があると感じた場合は、おそらく次のように処理します。
Contact
次のようなプロパティを持つテーブルにすべてを格納します。
ID
: 一意の連絡先 ID
PhoneNumber
: 文章
PhoneTypeID
: (それが PhoneType テーブルにリンクしている場合は何でも)
IsEmergencyContact
: ブール値
ContactName
: TEXT、フリーフォーム、担当者の宛名の書き方
CustomerID
: Customer テーブルにリンクする外部キー
Notes
: MEMO、連絡先に関する有用な情報
Rank
: INTEGER、この連絡先のソート可能な重要度
複数の顧客に連絡先を再利用できるように、顧客を連絡先から切り離したい場合は、中間テーブルが必要になります。
Contact
テーブルは次のようになります。
ID
: 一意の連絡先 ID
PhoneNumber
: 文章
PhoneTypeID
PhoneType
: (それがあなたのテーブルにリンクしている場合は何でも)
ContactName
: TEXT、フリーフォーム、担当者の宛名の書き方
Notes
: MEMO、連絡先に関する有用な情報
そしてCustomerContact
テーブル (多対多の関係を可能にする):
CustomerID
: Customer テーブルにリンクする外部キー
ContactID
: Contact テーブルにリンクする外部キー
IsEmergencyContact
: ブール値
Rank
: INTEGER、この連絡先のソート可能な重要度
IsEmergency
連絡先のリストと緊急連絡先のリストを表示および管理するには、true または falseに基づいて情報を表示する各リストボックスまたはサブフォームをフィルタリングするだけです。
同じ連絡先に複数の電話番号を持たせたい場合は、すべてをさらに分割する必要があります。
Contact
テーブルは次のようになります。
ID
: 一意の連絡先 ID
ContactName
: TEXT、フリーフォーム、担当者の宛名の書き方
Notes
: MEMO、連絡先に関する有用な情報
PhoneNumber
テーブルには次のものが含まれます。
ID
: 電話記録ID
ContactID
: Contact テーブルにリンクする外部キー
PhoneNumber
: 文章
PhoneTypeID
: (それが PhoneType テーブルにリンクしている場合は何でも)
Notes
: MEMO、この特定の電話番号に関する有用な情報
これで、必要なすべての情報を保存し、必要な方法で共有するための 4 つのテーブルができました。そのため、顧客は複数の連絡先 (緊急かどうかに関係なく) を持つことができ、連絡先は複数の電話番号を持つことができ、連絡先は顧客間で共有できます (つまり、1 人の顧客のcontact は別のお客様の緊急連絡先です):
Customer
Contact
PhoneNumber
CustomerContact
先ほど言ったように、正しい方法で行うと、実際に必要なよりもはるかに複雑になります。
時期尚早に複雑さを構築しないように注意してください。最悪のシナリオを予測するのは良いことですが、それは多くの場合、時期尚早に最適化し、アプリのコアほど重要ではないソフトウェアの領域に時間を費やしていることを意味します。
常に自問自答する必要があります: これを実装するのに 2 日間を費やすべきか、それとも UI の改良、データの整合性を確保するためのコードのテストまたは追加などに 2 日間を費やすべきか?
多くの場合、YAGNI