質問

私は、データベースシステムを構築し、私のテーブルのいずれかの設計に問題を抱えています。

このシステムでは、ユーザーテーブル、オブジェクト・テーブル、項目テーブル及びコストテーブルがあります。

コストテーブルの一意のレコードには、ユーザー、オブジェクト、アイテムや年によって決定されます。ただし、項目が異なる場合、同じ年持つ複数のレコードが存在することができます。

階層が行くUSER->オブジェクト - >アイテム - >毎年、項目ごとに複数のユニーク年、オブジェクトごとに複数のユニークなアイテム、ユーザーごとに複数のユニークなオブジェクト、複数のユニークユーザーます。

コストテーブルを設計するための最良の方法だろうか?

私は、ユーザーIDを含むことを考えていOBJECTIDと外部キーとしてITEMID、その後、ユーザーID、objecid、itemidのとcostyearからなる複合キーを使用しています。私は複合キーは悪いデザインであることを聞いたことがあるが、私は複合キーを使用してから逃げるために、これを構造化する方法がわからないと思います。あなたは私のデータベースを伝えることができたような建物のスキルは少しさびている。

ありがとうございます。

P.S。それが重要な場合は、これは、InterBaseのデシベルです。

役に立ちましたか?

解決

複合キーを避けるために、あなただけの代理キーを定義します。これは人工的な値は、例えば自動カウンタを保持します。

あなたはまだ(とすべきである)これらのカラムにユニーク制約を定義することができます。

ところで:それだけではなく、それは代理キーを使用することもお奨めです、複合キーを使用しないことをお勧め。すべてのテーブルでます。

他のヒント

ユーザーが見ることはありませんが、独自にコストテーブルの各エントリを識別すること、(代理キーと呼ばれる)は、内部で生成されたキーフィールド、CostIDのようなものを使用します(、UNIQUEIDENTIFIERやトリックを行うだろうIDENTITYなどのフィールドをSqlServerの中で。)

あなたが概説正確に列を使用して複合キーを使用してデータベースを構築してみて、何が起こるかを参照してください。あなたは驚きかもしれません。これらの4つの列でデータ欠損がないことを確認して作り、そして何の2行は、データの整合性を保護するのに役立ちますすべての4つの列に同じ値を持っていないことを確認します。

あなたは複合主キーを宣言するときは、

、あなたの宣言内の列の順序はdclarationの論理的帰結には影響しません。しかし、あなたも同じ順序で列を持つことになりますため、DBMSのビルドコンポジット索引、および複合インデックス内の列の順序はパフォーマンスに影響を与えています。

インデックスの最初の列は、クエリで指定されていないカラムである場合は、

つのみ、2つ、またはこれらの列のうち3つを指定するクエリの場合、インデックスは役に立たないであろう。あなたのクエリは私にgonig、そしてほとんどが高速に実行する必要が照会されている方法を事前に知っていれば、これはあなたが正しい順序で主キーの列を宣言することができます。二、三の追加1つの列のインデックスを作成するまれな状況では、更新が遅くの費用で、いくつかのクエリをスピードアップすることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top