質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

1回答

1114閲覧

サロゲートキーおけるリレーションの表現方法

pokemonta

総合スコア170

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

1クリップ

投稿2020/05/05 14:38

編集2020/05/06 05:59

以下の2ケースにおいて、E-R図でどのように表現したらよいかわかりません。
ご教示願います。

1.異常が発生したら通知先アドレスに通知する。
それぞれにサロゲートキー(NO)があって、外部キーがないので
リレーションを表現することができません。(異常履歴←通知マスタみたいな。。)
異常コードは共通してありまして、異常履歴に異常コードが書き込まれたら
該当する異常コードがある通知先マスタの通知先アドレスを読み込むようにしたいです。
そもそもこういったケースは、リレーションを張らないものでしょうか?
---------------------------------------------------------------
5/6 追記
従属関係がないから、リレーションを張る必要がないと言い切れなくて質問に至りました。
なぜなら、異常履歴にE001が入ると123@gmail.comが決まるので

 これをどうE-R図で表現するのかが質問の意図です。
異常履歴
No1シーケンシャルな番号
発生日時2020/5/5 13:00IoT機器からの異常通知
異常コードE001コード定義
通知先マスタ
No1シーケンシャルな番号
通知先アドレス123@gmail.com一致したときのメール送信先
異常コードE001,E002異常履歴の異常コードと一致すれば

2.天気と売り上げの相関関係を見たいです。
特に日時を持つイベント系テーブルのリレーションの張り方が
わかりません。 

気象実績
No1シーケンシャルな番号
発表日時2020/5/5 14:00気象会社のHPより1日1回取得
エリアtokyo
天気hare
売上
No1シーケンシャルな番号
売上日時2020/5/5 14:05posシステムのデータ
売上金額5,000円posシステムのデータ

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2020/05/05 14:50

やろうとしてる事がイマイチよくわかんないけど、スキーマの設計の話という事で良いんですか? 機械学習云々はこの話で必要な要素? 「外部キーがないので…」というのは、必要であれば外部キーを持てばいいだけでは? どの部分が悩みなのかよくわかりません。
pokemonta

2020/05/05 14:54

外部キーをそもそもこういったケースで追加すべきか。追加するならどこに挿入すべきか。 2は、相関関係をみたいので機械学習とは違うかもしれませんが傾向を把握するために リレーションを張るべきかを確認したいです
gentaro

2020/05/05 14:59

そもそも「異常コード」「通知先アドレス」がどんなものが入り、どのように利用されるのかを提示しないと、第三者に判断できませんが。 いまの作りだとどちらもマスタとして登録されるということは、「通知先アドレス」ごとに「異常コード」が振られているという意味ですよね? そこら辺のモデルの説明がないとアドバイスなんて無理ですよ。
gentaro

2020/05/05 15:02

特に混乱するのが、冒頭「E-R図でどのように表現したらよいかわかりません。」と書きながら、結局聞きたいことは外部キーが必要なのか否かという話に変わってると思うんで、そこら辺もうちょっと整理して質問文書いてみてください。
gentaro

2020/05/05 15:04

あとサロゲートキーってただの主キーでしかないので、それが有ることで何を迷うのかも全然よくわかりません。
pokemonta

2020/05/05 15:11

機器idとか物件idとか従業員番号とかが主キーならそのまま外部キーとして使えるかと 思いました。つまり、キー自体に意味があり紐づけが可能かと。。
gentaro

2020/05/05 15:20 編集

サロゲートキーっつーのはナチュラルキーと違って「テーブル内で一意」である以外に意味を持ちませんよ。 例えばテーブルAをテーブルBから参照するための外部キーなら、テーブルBにテーブルAのキー(id)を持たせて、外部キー制約を張ればいいだけです。 なので意味とか紐付けとか、どこで悩んでるのかよくわかりません。
gentaro

2020/05/05 15:26

「通知先マスタ」の「異常コード」はひとつのカラムにカンマ区切りで複数の値が入るんですか? それならちょっと設計としてどうかと思いますが。
guest

回答1

0

ベストアンサー

とりあえず2はリレーション云々は関係ありません。
モデル同士に直接の関係がないので。

1はテーブル設計がよくわかりません。
「異常履歴」というのはトランザクションデータだと思いますが、トランザクションデータの追加をトリガーにしてマスタを書き換えるというという意味?

「異常履歴」側がマスタの情報を参照してるわけじゃないのなら、これもリレーションは関係ありませんが。

投稿2020/05/05 15:30

gentaro

総合スコア8947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pokemonta

2020/05/06 04:33

1に関しまして少し違います。 「異常履歴」にトランザクションデータが追加されるとその中の異常コードを見て (トリガーにして)通知先マスタの異常コードと一致すれば通知先マスタの通知先アドレスに 連絡するということです
gentaro

2020/05/06 05:36

その「連絡する」というのは、基本的にはそのDBを参照するアプリ側の話ですよね。 スキーマの定義には直接関係のない話です。 DBに限定して話すのであれば、組み込みのトリガー等の機能を使ってINSERTされたタイミングで通知先マスタを参照してその「連絡先」に何らかの手段で通知を行えばいいだけなので、その履歴がマスタへのリレーションを持っている必要はありません。 トリガーで何が出来るのかについては使ってるDBMS次第なので、そちらのリファレンス等を読んでください。 あと低評価押してるヤツはこの質問文の文脈読みとって回答してやれ。 書いてる内容をそのまま解釈したらどっちもリレーションは関係ない。
pokemonta

2020/05/06 05:55

おっしゃる通りです。やっぱりトリガーですよね。。 異常履歴と通知先マスタは、直接のリレーションはない。 ニュアンスがむずいんですが、一方が決まれば他方が決まるわけではない? う~ん。異常履歴に挿入されたレコードによって間接的には、通知先がわかる。 >その「連絡する」というのは、基本的にはそのDBを参照するアプリ側の話ですよね。 >スキーマの定義には直接関係のない話です。 >DBに限定して話すのであれば、組み込みのトリガー等の機能を使ってINSERTされたタイミングで通知>先マスタを参照してその「連絡先」に何らかの手段で通知を行えばいいだけなので、その履歴がマスタ>へのリレーションを持っている必要はありません。
gentaro

2020/05/06 06:11

仮に外部キーが存在するとすれば、異常発生時に異常履歴にデータが入るのと同時に、それがどの「通知先」に結びついたのかという結果を表すキーぐらいでしょう。 現状の「通知先マスタ」の構造が意味不明なのでアレですが、例えば ・通知先(ID, アドレス) ・異常履歴(ID, 発生日時, 異常コード) というテーブルが基本にあったとして、「通知先」は複数の「異常コード」に結びつく(通知先を跨いだ異常コードの重複はない)のなら、これは別テーブルで ・通知先_異常コード(通知先ID(FK, ref(通知先)), 異常コード) という関係テーブルを作り、 ・異常履歴(ID, 発生日時, 異常コード(FK, ref(通知先_異常コード)) みたいになるとか。 あと異常コードがそもそも何を表しているのかわかんないから、それなら異常を表すマスタを用意して ・異常(コード, 説明) みたいなテーブルに大して外部キーを張るとか、そういうのならわかりますけど。
pokemonta

2020/05/06 07:55

成程。ありがとうございます。 通知先→通知先_異常コード→異常履歴 にして、異常履歴にデータが入れば、 通知先_異常コードから通知先を拾えるということですね。 関係テーブルがいるとかの勘所がないです。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問