1

これは何度も質問されていると思いますが、他の人のデザインを理解するのが難しいだけです.

私はデータベース設計を学んでいて、Database Design for Mere Mortals を読んだばかりで、別の本を読んでいます - MySQL の Paul Dubois mysql 内で正規化されたデータを処理する方法を理解するのに苦労しています。

元の Access データベース (設計が悪い!) には、プロジェクトのリストがありました。これらには、Site_ID (PK)、プロジェクト コード、プロジェクト タイトル、プロジェクト マネージャー、自治区、National Grid Reference などのさまざまなフィールドが含まれていました。

Borough や National Grid 参照などのフィールドには、複数の値が含まれる場合があります。たとえば、プロジェクトは複数の区に存在し、複数の National Grid Reference を持つことができ、これらは各フィールドにコンマで区切られてリストされていました。

例: 自治区: ニューハム、ハックニー NGR: TQ 3692 8506、TQ 3768 8600、TQ 3756 8332、TQ 3880 8468

列挙するのは簡単ですが、検索するのは難しいです。そこで、これらを多値フィールドとして、プロジェクト リスト テーブルから取り出し、Borough_County テーブルと National_grid_Reference テーブルと呼ばれる独自のテーブルに配置しました。

これに関して2つ質問があります

1 つ目はキーに関するもので、2 つ目はデータをユーザーに表示する方法に関するものです。

単なる人間の本では、最初のテーブル(プロジェクト)から主キーを取得し、それを正規化されたテーブル(自治区/郡およびNGR)に入れることを示しているようです。同じキーを使用します。また、外部キーと同じキーを使用します。

Projects Table Site_ID (PK)
Project Code
プロジェクト名
など..

Borough_County テーブル
Site_ID (プロジェクトからのプライマリ キーと外部キーの両方)
Borough または County

National Grid Ref table
Site_ID (プロジェクトからのプライマリ キーと外部キーの両方)
NGR_SQ
NGR_Easting
NGR_Northing

1:n の関係があるため、これは意味がありません。独自の主キーを持つ必要がありますか?

2 番目の質問は、正規化されたテーブルをユーザーに表示する方法です。

正規化されたテーブルと元のプロジェクト テーブルを「ビュー」で再び一緒に戻したことを理解しています。

さまざまな正規化されたテーブルからデータを入力する手段としてビューを使用したいと思います。たとえば、TQ 3692 8506、TQ 3768 8600 などを NGR で記述することに慣れているため、データベースに値を正しいフィールドに分離させるにはどうすればよいでしょうか? TQ と 3692 の間にスペースを入れると、それが新しいフィールドだとわかりますか? 間にコンマを入れた場合、正規化されたテーブルの新しいレコードであることがわかりますか (わかりますか)?

それとも、Excel のやり方に慣れているので、これを完全に間違った方法で見ているのでしょうか?

助けてくれてありがとう。

4

1 に答える 1

1

1:n の関係があるため、これは意味がありません。独自の主キーを持つ必要がありますか? はい。ただし、多対多の関係を解決するには、さらに連想テーブルが必要です。

Projects Table 
Site_ID (PK)
Project Code
Project title
etc..

Borough_County table
BC_ID
Borough or County

National Grid Ref table
NGR_ID
NGR_SQ
NGR_Easting
NGR_Northing

Projects_Borough_county
BC_ID
Site_ID

Projects_National_Grid
NGR_ID
Site_ID

2 番目の質問は、正規化されたテーブルをユーザーに表示する方法です。 アクセスでは、これはサブフォームで行われます ユーザー インターフェイスと使用されている mySQL バックエンドに応じて、これは Site_ID でフィルタリングする 2 つのテーブルを一緒に結合するクエリに基づいて行われます

したがって、ユーザーが Site_ID 1 を選択した場合、そのサイトの Borough_County を取得するためのクエリは次のようになります...

SELECT BC_ID, `Borough or county` 
FROM borough_County BC
INNER JOIN projects_Borough_county PBC on PBC.BC_ID=BC.BC_ID 
WHERE PBC.Site_ID = 1

正規化されたテーブルと元のプロジェクト テーブルを「ビュー」で再び一緒に戻したことを理解しています。 できますが、する必要はありません。

*さまざまな正規化されたテーブルからデータを入力する手段としてビューを使用したいと考えています。たとえば、TQ 3692 8506、TQ 3768 8600 などを NGR で記述することに慣れているため、データベースに値を正しいフィールドに分離させるにはどうすればよいでしょうか? * ユーザー インターフェイス (UI) がデータベースを必要とするわけではありません。ビューが機能しない可能性がありますが、現在更新中です。RDMBS / UI、およびその他のいくつかの要因によって異なります。しかし、それは一般的に最適な設計ではありません。(レコードのロックは、複数のテーブルへの更新と同様に問題になる可能性があります)

* TQ と 3692 の間にスペースを入れると、新しいフィールドだとわかりますか? * いいえ

** との間にカンマを入れると、正規化された新しいレコードであることがわかります (わかりますか)。再びいいえ。

これが、使用している UI について尋ねた理由です。

ここにあるのは 3 つのメイン テーブルです。Projects、Borough_County、および National Grid Ref. これらの各テーブルには、独自の作成、確認、更新、削除 (Crud) アクションがあります。Projects テーブル内で、プロジェクトを (1 つまたは複数の) Borough County、または国のグリッド参照にリンクする可能性があります。これを行うときに、ユーザーが新しい存在しないエントリを National Grids/Borough County に追加できるようにすることができます。効率的に設計された UI では、ユーザーはカンマ区切りのリストを入力したり、スペースを処理したりできますが、データを正しい構造に解析する必要があります。UI/データベースではありません。これを行うとき、メイン テーブルにエントリを追加し、連想テーブルにエントリを追加します (上記の構造では Projects_ で始まります)。

于 2013-06-24T15:18:04.887 に答える