私が取り組んでいるWebアプリケーションで、予期しない「バグ」が発生しました-アプリのデータベースには、「States」と「Cities」という2つのテーブルがあります(他にも多数あります)。
'状態'テーブルフィールド:
-------------------------------------------
idStates | State | Lat | Long
-------------------------------------------
' idStates 'は、自動インクリメントの主キーです。
'都市'テーブルフィールド:
----------------------------------------------------------
idAreaCode | idStates | City | Lat | Long
----------------------------------------------------------
' idAreaCode 'は、国コード+市外局番で構成される主キーです(たとえば、91422はインドの国コード、422はインドの都市の市外局番です)。' idStates 'は、' States 'テーブルから派生した外部キーであり、' Cities 'テーブル内の各都市を対応するStateに関連付けます。
国コードと市外局番の組み合わせは都市ごとに一意であるため、主キーとして安全に使用できると考えました。すべてが機能していました。しかし、インドのある場所では、データベース設計に予期しない「欠陥」が見つかりました。米国のように、インドは連邦民主主義であり、地理的に多くの州または連邦直轄領に分割されています。州と連邦直轄領の両方のデータが「州」テーブルに保存されます。ただし、 2つの州(ハリヤーナ州とパンジャブ州)に属し、それ自体が連邦直轄領でもある1つの場所(チャンディーガル)があります。
明らかに、現在のデータベース設計では、都市「チャンディーガル」の複数のレコードを保存することはできません。
提案された解決策の1つは、列' idAreaCode 'と' idStates 'を組み合わせた主キーを作成することです。
これが可能な最善の解決策であるかどうか知りたいですか?
(参考:InnoDBエンジンでMySQLを使用しています)。
詳しくは:
- データベースには、各都市の気象情報が格納されています。したがって、州と市は各クエリの開始点です。
- 各都市の最新データは、CSVファイルを使用して毎日挿入されます。CSVファイルには、各レコードを識別するために使用されるidStates(州の場合)およびidAreaCode(都市の場合)列が含まれています。
- データベースの正規化は私たちにとって重要です。
注:都市テーブルに自動インクリメントの主キーを使用しない理由は、データベースがCSVファイル(別のアプリによって生成されたもの)を使用して毎日/毎時更新されるためです。また、CSVファイルの各レコードは、idStates列とidAreaCode列で識別されます。したがって、都市テーブルで使用される主キーは、テーブルが削除されて再度更新された場合でも、すべての都市で同じであることが望ましいです。郵便番号(またはPINコード)と市外局番(またはSTDコード)は、一意で静的(頻繁に変更しない)であるという基準を満たし、これらのリストを簡単に入手できます。(インドはPINコードを新しい形式に更新中であるため、今のところ市外局番を決定しました)。
私たちが決定した解決策は、データベース設計に変更を加えるのではなく、アプリケーションレベルでこれを処理することでした。データベースには、「チャンディーガル」のレコードを1つだけ保存します。このアプリケーションでは、検索をこのレコードにリダイレクトするために、「Chandigarh、Punjab」または「Chandigarh、Haryana」の検索用のフラグを作成しました。ええ、それは理想的ではありませんが、これが私たちがこれまでに遭遇した唯一の例外であるため、許容できる妥協案です。