問題タブ [surrogate-key]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
714 参照

mysql - 代理キーを使用して更新クエリを実行する方法

私はデータベースの概念に非常に慣れておらず、現在データベースの設計方法を学んでいます。以下の列を持つテーブルがあります...

これはmysqlにあります:

上記の列は将来変更される可能性があるため、主キーとして選択できません。そこで、自動インクリメント ID を names_id として作成しました。また、このテーブルを表示する GUI (JTable) もあり、ユーザーは Names.Names に基づいて Result、issues_id、およびコメントを更新します。ここにあるのは大きなテキスト列です。GUI では意味がないため、GUI に names_id を表示できません。GUI で列 2、3、4 の入力を行った後にユーザーがデータベースを更新すると、以下のクエリを使用してデータベースを更新しましたが、where 句で names_id を使用できませんでした。行は JTable にロードされます。

データベースを更新できましたが、PK を使用せずにデータベースを更新してもよいかどうかを知りたいです。これはどのくらい効率的ですか?ここで代理キーはどのような目的に役立ちますか?

0 投票する
1 に答える
425 参照

asp.net - データベース設計には代理キーとの関係があります

まず、すべての属性/フィールドを更新できるようにしたいのですが、単一の一意のキーはありません。各 PC を PC1/PC2/PC3 として分類でき、例を挙げられず、各 PC にネットワークとソフトウェア情報があるような階層があります。デザインと作例は

Parent Table PC(EmpName, PCName, HostName,.... PhysicalLocation, PCType) EMPName,PCName,PCType組み合わせると、このテーブルがユニークになります。

記録例('XYZ', 'Work Laptop','XYZ-PC',.....,'DESK-123','PC1')

子テーブルPCNetwork(EmpName, PCName, HostName,IPAddr,....,PhysicalLocation,PCType)

example record1 ('XYZ', 'Work Laptop','XYZ-PC','0.0.0.0',....,'DESK-123','PC1')

example record2 ('XYZ', 'Work Laptop','XYZ-PC','0.0.0.1',....,'DESK-123','PC1')

すべてのフィールドを変更可能にしたいので、両方に Surrogate Key Id 列を追加しました。PC-Id をネットワーク テーブルへの FK として使用しましたが、挿入中に、PC テーブルから ID を取得するクエリを作成する必要があります。

2 つの問題があります。自然/複合キーを使用すると、主キーの更新を許可しない Asp.Net Gridview を介して更新が行われるため、すべてのレコードを更新できません。

サロゲート キーを使用すると、レコードが重複する可能性があり、それらを参照したり、他のフィールドに外部キー制約を設定したりすることはできません。これらは 3 つのフィールドすべてを結合することによってのみ一意になるためです。

SQL Server 2008 と ASP.Net 4.0 を使用しています

私は確かに何かが欠けています.誰かがこれを助けたり、良いデザインを提案したりできます. ありがとう!!

0 投票する
1 に答える
1060 参照

doctrine-orm - Doctrine2 の関係エンティティ (関係でもあるエンティティ) の複合主キーまたは代理主キー

私は関係であるエンティティを持つ大規模なデータベースを持っています。これはまさにDoctrine 2 マニュアルの次のコメントによるものです: 私はリレーションに追加の属性を保存する必要があり、このためリレーションはエンティティになりました。

通常、エンティティには生成された ID を使用し、関係には複合キーを使用します。この場合、エンティティは関係であるため、選択が少し複雑になります...

ここでは自然キーについて話しているわけではないことに注意してください。それぞれの所有エンティティで自動インクリメント戦略を使用して作成された整数である ID から構成される複合キーを使用しています。

リレーションシップ エンティティで複合主キーを使用することには、いくつかの欠点があります。

  • エンティティとその関係を作成する間に persist を呼び出す必要があります (複合主キーで外部キーとして使用する前に、エンティティでキーを生成するため)。
  • 追加のエンティティを関係エンティティに関連付けるには、複合キーで使用される ID の列をそれらのエンティティに再度追加する必要があります。サロゲート主キーを使用する場合、その 1 つの ID を保持する 1 つの列だけが必要です。

たとえば、複合キーを使用する利点もいくつかあります。

  • 特定の結合クエリが不要になる代わりに、複合キーを使用して情報を直接抽出するクエリを作成できます。

しかし、現時点で複合キーを使用するための最も重要な議論は次のとおりです。

  • User と SomeEntity の間の関係が削除され、後で再び作成された場合 (アプリケーション モデルで発生する可能性が高いシナリオ)、他のすべての関連エンティティへのアクセスも復元する必要があります。User と SomeEntity の間の関係が、代理主キーの自動インクリメント戦略を使用して作成されている場合。復元された (新しい) 関係は、新しい主キー (id) を取得します。このため、関連するエンティティ (「古い」キーを使用して格納されている) にはアクセスできなくなります。リレーションシップで複合キーを使用すると、単純にリレーションシップを復元でき (同じ複合キー値を取得します)、それによって、他の関連するエンティティにすぐにアクセスできるようになります。

同様のシナリオを経験した人はいますか? これを適切に機能させるための他の解決策はありますか。私が見逃した重要な欠点や利点 (Doctrine ORM を使用する場合) はありますか?

私が考えることができる 1 つの代替手段は、状態を User SomeEntity 関係に追加することです。エントリを削除する代わりに、状態を無効、有効に変更できます。そのようにして、エントリが削除されないため、複合キーの代わりに代理キーを使用できます...

フィードバックは大歓迎です...

興味のある人のために、スタックオーバーフローのサロゲートキーと複合キーに関する素晴らしい議論もありました: (クリック)

0 投票する
0 に答える
581 参照

foreign-keys - データマートの代理キー

3 つのファクト テーブルに 32 のディメンションがあり、現在 SQL Server 2012 に取り組んでいます。

SQL Server の外部キーはインデックスごとに 16 個に制限されているため、代理キーを使用してファクト テーブル内のデータにインデックスを付ける必要があるということですか?! または、この問題の別の解決策はありますか?

私の ETL は毎月実行されるため、挿入するデータ (外部キーの連結) がまだ存在しないことをすべてのデータポンピングの前にチェックする必要がありますか?!

代理キーを使用することに決め、モンドリアン キューブ (ペンタホ) を使用している場合、作業方法 (スキーマの作成) は同じですか、それとも通常の方法とは異なりますか?

ありがとうございました。

0 投票する
2 に答える
6720 参照

ssis - 代理キーを検索し、ファクト テーブルに入力する

ディメンション テーブルを検索してファクト テーブルに入力する必要がある8 つの代理キーがあります。ディメンション テーブルへの8 つのルックアップを作成し、マージ結合コンポーネントと並べ替えコンポーネントを使用して、データを 1 つの結果セットにマージし、ディメンションテーブルに挿入します。私の心配は、挿入を行う前に多くのマージとソートが行われ、パフォーマンスが良くないことです。上記で説明したことを達成するための最良の方法は何ですか?

0 投票する
5 に答える
3383 参照

mysql - メールアドレスを主キーにする考え方

電子メール アドレスを主キーとして使用する方法は? それを避けて、代わりに自動インクリメントされた ID 番号を使用する必要がありますか、それともエンジンはそれを処理できますか?

MySQL データベースですが、他のエンジンがこれをどのように処理するかに興味があります (特に PostgreSQL)。

0 投票する
1 に答える
879 参照

etl - 代理キー (および SCD) を使用した DWH インポート

内部代理キーとタイプ 2 の緩やかに変化するディメンションを使用するデータ ウェアハウスがあります。クリアリングでは、次のように、erp システムからのビジネス キーのみを取得します。

Clearing の画像、申し訳ありませんが、直接または 2 つ以上のリンクを投稿するには十分な評判がありません

データ ウェアハウスでは、代わりに代理キーを使用したいと考えています (注: 記事の価格が 500 ドルから 1000 ドルに変更され、可能であれば記事は代理キーを使用しています。ここでは製造元のみ)。

データウェアハウスのイメージ

ビジネス キーのみを使用していた場合は問題ありません。古いエントリを比較して更新し、新しいエントリを挿入するだけです。しかし、代理キーでこれを行う最良の方法は何ですか?

クリアリングでデータ ウェアハウスから既存の ID (まだ存在しない場合は 0 または -1) を取得し、エントリを比較しますか?

ここに画像の説明を入力

ビジネス キーをデータ ウェアハウスにも保持し、それらを比較して ID を更新してから、データ ウェアハウスに入れますか?

i.pictr.com/3kqn6wb9ou.png