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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1451閲覧

「NULL排除について」の質問について分からない点があったのでお聞きしたいです。

tomuziso

総合スコア40

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2018/04/21 03:24

https://teratail.com/questions/103726

こちらの「NULL排除について」の質問について拝見していました。
しかし書かれていることについて理解があまり進まず分からない点があったので質問致します。

質問者の現状のDB構成は以下だということは分かりました。
(Modelは回答者の例から店舗と置き換えています)

DB

店舗(model)モデル

idprefecture_idcity_id
111

都道府県(Prefecture)モデル

idprefecture~~~
1東京都~~

市区町村(City)モデル

idcity~~~
1奥多摩町~~

都道府県中間

idmodel_idprefecture_id
111

市区町村中間

idmodel_idcity_id
111

質問点

何故1対1の関係を使っているのか

質問者の質問によると

Modelと Prefecture Cityは一対一の関係です。

とあります。

しかしここで都道府県と市区町村というデータが保存されている、ということは
都道府県と店舗で言うと「1対多」と自分は感じましたが間違っているのでしょうか?
「「東京都」はたくさんの「店舗」を持てる」というように考えると1対1ではないような気がしました。

1対1ということは例えば「東京都」というレコードが複数存在する可能性があるということでしょうか?

Unknownレコード追加とは?

回答者のmiyabi-sunさんから解決策が提案されています。

まずはPrefectureとCityのマスターテーブルに「見当たらなかった」用のUnknownレコードを追加しよう。

ここで言う「Unknownレコード」追加の解決法とは

  • 都道府県モデルで言うと、prefectureカラムにunknownというデータを挿入。
  • 店舗モデルで都道府県が表記ゆれ等で適切な外部キーが引けなかった場合は、挿入したunknownのidを外部キーとする(これで中間テーブルの存在は要らなくなる)

という認識で合ってるでしょうか?

店舗モデルはどういった設計をイメージしているのか?

最後にこちらの質問者が作成しているDB設計についてです。

そもそもの設計として「店舗モデルに住所をCSVからインポートする」ということは、DBとしては

idaddressprefecture_idcity_id
1東京都足立区~~~11
2東京都千代田区~~~12
3とうきょと足立区~~~11

こういう設計になっているということでしょうか?
自分自身CSVからインポートするという経験がないのであまりイメージできていません。
CSVからインポートする際にprefectureやcityテーブルを参照して一致したら外部キーのidを書き込む、という方法なのでしょうか?

以上の3点がこちらの質問を拝見させていただいて分からない点でした。
どなたか教えて頂ける方いらっしゃいましたら教えていただきたいです。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

RoRから離れたデータベースの観点で、システムのDB構成を見ると
理解、そして誤解点の修正ができると思います。
なおRoR自体はあまり詳しくないので、その点はご理解ください。

回答

「「東京都」はたくさんの「店舗」を持てる」というように考えると1対1ではない

この認識は正しくないです。現実に**「店舗」は1つの住所しか持たないので、
1つの「都道府県」データと1つの「市区町村」データで
住所を示せます、1つですみます。
ですから
「1対1」の関係**なのです。

ですので

1対1ということは例えば「東京都」というレコードが複数存在する可能性があるということでしょうか?

とはなりません。
あくまで都道府県(Prefecture)モデルが主語であり、どういう項目を持つのかがポイントです。
都道府県(Prefecture)モデルはたくさんの「都道府県」データを持てるのです。
(実際には北海道から沖縄県までですが)
そして「東京都」は都道府県(Prefecture)モデルのデータの1つです。

都道府県(Prefecture)モデル、市区町村(City)モデルともに、「東京都」は1つだけ、また青梅市も世田谷区もそれぞれ1つだけモデルに存在することになります(現実世界でもそうなっていますね)。

Unknownレコード追加とは?

都道府県モデルで言うと、prefectureカラムにunknownというデータを挿入。

これは不明なprefectureそのもののデータを追加することです。

たとえば

47 沖縄県 ~~

の後に 「48 東京県 ~~」
と追加idを付加し、追加します。

店舗モデルはどういった設計をイメージしているのか?

これはわかりません。元の設計者の考えを聞くか、ここで公開していただくしかないですね。

ただ

CSVからインポートする際にprefectureやcityテーブルを参照して一致したら外部キーのidを書き込む、という方法なのでしょうか?

これは厳密な意味では間違いです。インポート作業はデータを流し込むだけです。

ただしインポートの前処理でありえない誤データの削除や、重複行を排除する作業をします。
テーブル(マスター管理テーブル)では、prefectureやcityテーブルを参照して一致したら・・・の処理は現実にはします
(もしマスターテーブルで ゆれがあると、これを参照する画面要素、リストボックスの表示に影響がでる、などありますからね)。

「リレーションシップ」に関しての詳しい解説

このモデルは、DBシステムにおけるテーブルなどのスキーマ定義の元データです。
で、実行結果できるDBのテーブル(テーブルそのもの)は、各モデルが元になると思います。

そうなると、普通にDB理論におけるER図、
「エンティティとリレーションシップ」の考え方で通用すると考えます。
そして質問者の方の疑問点は、ずばり「リレーションシップ」の捉え方、
認識が設計者と違う
ということになります。


本題の

都道府県と市区町村というデータが保存されている、ということは
都道府県と店舗で言うと「1対多」と自分は感じましたが間違っているのことなるでしょうか?
「「東京都」はたくさんの「店舗」を持てる」というように考えると1対1ではないような気がしました。

1対1ということは例えば「東京都」というレコードが複数存在する可能性があるということでしょうか?

一般的なDBでの現実の世界からの「エンティティとリレーションシップ」の洗い出し法を元に、3つのモデルを見るといいです。

実際にはこんな感じで抽出していきます(関係ある一部のみ、書きます)

1.店舗(model)モデル、都道府県(Prefecture)モデル、市区町村(City)モデルが扱うエンティティ(モデル)があって、それぞれは属性を持つ、(以下、省略)

2.店舗(model)モデルは1つの都道府県(Prefecture)モデルを所有する(=のみ所有する)

3.店舗(model)モデルは1つの市区町村(City)モデルを所有する(=のみ所有する)

ここで太字にした箇所が誤解されている、異なる点ですね。
いずれも「1対1」です。

2.「「東京都」はたくさんの「店舗」を持てる」ではなく、(主体である)「店舗」は
現実には1つの住所しかもたないわけですから店舗モデルには1つの都道府県モデルが存在する。

3.同じように店舗は1つの区や市町村に属します。店舗モデルには1つの市区町村モデルが存在する。

投稿2018/04/21 05:14

kawakawa2018

総合スコア1195

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

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

tomuziso

2018/04/22 00:00

回答ありがとうございました! > 1対1の関係、リレーションシップに関して 説明を受けて腑に落ちました。これは自分が正しく理解できていませんでした。 UserとTweetモデルの関係が1対多であった場合でも、「Tweetモデルのレコードの一つである「一つのツイート」に対して多の関係ではなく、「Tweetモデルに対して多だから1対多」」ということですね。 これを今回の店舗と都道府県に置き換えてみると、当然1対多の関係ではありませんでした。 一つの都道府県しか持たないですよね > Unknownレコード追加 これは47都道府県がマスターとして存在しているとして、CSVから読み込んだ表記ゆれ等で判別出来ないものを追加という認識で大丈夫でしょうか? つまり、48 とーきょーと ~~ というような? > CSVインポート 基本的にCSVから取り込む作業の事を指して、その他の処理はCSVのファイルの方を修正する(インポート前に処理)という認識でいいでしょうか? ちなみに今回の設計で、インポートするテーブルに「外部キーが存在する(prefecture, city)、かつnull制約」の場合、そのままインポート出来ないのでCSVの方に外部キーを追記する処理などを行うのでしょうか?
sazi

2018/04/23 02:30

>Unknownレコード追加 は外部キー制約の為に行うので、マスターに追加するってことです。 CSV取込時に外部キーのエラーになる度にマスターに追加する作業を行うってことになります。 ※事前にチェックして纏めて登録って方法もあるでしょうけど。
tomuziso

2018/04/24 03:23

補足ありがとうございます。 ということは、手順としては 1. CSVインポート時、「住所の項目」をその都度マスターデータと照会 2.照会してエラーの時(表記ゆれなど)に、マスターデータを追加する処理を行う ということをCSVインポートするプログラムを組む際に記述しておく、ということで合っているでしょうか?
sazi

2018/04/24 03:57

インポート前に行う手順として問題ないと思いますが、参照されている質問の回答にあった通り、外部キー制約の本来の目的を果たしていない事はお忘れなく。
tomuziso

2018/04/24 08:00

確かにそうですね、やってることはnullが入ることの代わりに新しくマスターデータを追加することで回避している、というような事ですよね。 手順としては合っていたということ安心しました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問