1

下の画像に示すように、多対多の関係をコーディングするのに苦労しています。

ここに画像の説明を入力

これらのテーブルと関係を次のように設定したいと考えています。

  • 親は複数の子 (ここでは子は「プレイヤー」) を持つことができ、子は 1 人または複数の親 (最大 2 人) を持つことができます。
  • 「家族」は、1 人以上の親 (最大 2 人) と 1 人以上の子供 (無制限) で構成できます。

「子供」とは異なる姓を持つ両親に対応する方法がわかりません。また、その逆も同様です。これが懸念されるかどうかは知らされていませんが、これは考える価値があると思います. Parent クラスと Player クラスはどちらも、person スーパークラスからフィールド (姓名、住所、年齢、生年月日など) を継承します。

ファミリー テーブルへの入力をテストしようとしたとき、1 人または複数の親と、その親 (または介護者) である 1 人または複数の子供を挿入する方法が正確にわからないことに気付きました。理論的にはこれで解決したと思っていましたが、テストの結果、うまくいかないことがわかり、90 分以上かけていくつかのアイデアのスケッチを作成しましたが、本当に道に迷ってしまいました。

================================================== ================================

更新: 2012 年 4 月 27 日 @ 午後 22 時 19 分 NZST

これらのテーブルを含むデータベースにクエリを実行するときに、探している結果を視覚的に表現する必要がありました。視覚的な表現は次のとおりです。

+-------------------+-----------------+---------------------+
| ParentsFirstName  | ParentsLastName | ChildrenInFamily    |
+-------------------+-----------------+---------------------+
| Gregory           | Peck            | Michael             |
| Laura             | Peck            | Michael             |
| Martha            | Petersen        | Matt, Christopher   |
| Chris             | Michaels        | Richard, Shaun      |
| Nadine            | Michaels        | Richard, Shaun      |
| Barry             | Dackers         | Harry               |
| Kevin             | Mitchell        | Daniel              |
| Rebecca           | Mitchell        | Daniel              |
+-------------------+-----------------+---------------------+

「子」は「プレーヤー」というテーブルにあり、親は「親」というテーブルにあります。この投稿の MySQL コードは、この特定の問題に関するテーブルを表しています (Person クラスをスーパー クラスとして使用し、親/子テーブルをサブクラスとして使用していることに注意してください)。他のいくつかのテーブルは、外部キーを使用して参照されます (「schoolID」フィールドは、「schoolName」フィールドを持つ「School」というテーブルから取得されます)。

私が達成したいことのためにテーブルを正しく構築したかどうかはわかりませんが、いくつかの調査を行ったところ、GROUP_CONCATという関数が見つかりました。これにより、少なくともクエリがどのように見えるかを考えることができました-この特定の問題。

同じ苗字ではない両親や、両親と同じ苗字ではない子供たちを受け入れることは、もう 1 つの大きな課題です。里親の場合も同様です。)したがって、上記の視覚化では、独身ではない親が結婚していて同じ姓を共有しており、子供たちは全員、既婚の両親と同じ姓を共有していると想定しています。

================================================== ================================

この部分を処理しようとするデータベースの部分を作成しようとしたコードを次に示します (注: 「プレイヤー」は親の「子」です)。

DROP TABLE IF EXISTS `person` ;
CREATE TABLE `person` (
  `personID` INT(5) NOT NULL AUTO_INCREMENT ,
  `firstName` VARCHAR(50) NOT NULL ,
  `lastName` VARCHAR(50) NOT NULL ,
  `dateOfBirth` DATE NOT NULL ,
  `personType` CHAR(6) NOT NULL, 
  `photo` BLOB NULL DEFAULT NULL ,
  PRIMARY KEY (`personID`))
ENGINE = InnoDB;
SHOW WARNINGS;

DROP TABLE IF EXISTS `parent` ;
CREATE TABLE `parent` (
  `parentID` INT(5) NOT NULL,
  FOREIGN KEY (`parentID`) REFERENCES `person` (`personID`)
  ON DELETE CASCADE 
  ON UPDATE CASCADE)
ENGINE = InnoDB;
SHOW WARNINGS;

DROP TABLE IF EXISTS `player` ;
CREATE TABLE `player` (
  `playerID` INT(5) NOT NULL, 
  `schoolID` INT(5) NOT NULL,
    FOREIGN KEY (`playerID`) 
    REFERENCES `person` (`personID`)
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
    FOREIGN KEY (`schoolID`)
    REFERENCES `school` (`schoolID`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;
SHOW WARNINGS;

DROP TABLE IF EXISTS `family` ;
CREATE TABLE `family` (
  `parentID` INT(5) NOT NULL ,
  `playerID` INT(5) NOT NULL ,
  PRIMARY KEY (`parentID`, `playerID`), 
    FOREIGN KEY (`playerID` )
    REFERENCES `player` (`playerID`)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
    FOREIGN KEY (`parentID`)
    REFERENCES `parent` (`parentID`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;
SHOW WARNINGS;

誰かがこの問題を解決するのを手伝ってくれて、いくつかのガイダンスと、説明付きの一般的な例さえ提供してくれれば、それは本当に良いことです. 親は 1 人以上の子供を持つことができ、子供は 1 人以上の親を持つことができるため、これは多対多の関係であると思います (このコンテキストでは、家族は実際には子供のいない家族ではありません)。 )。

よろしくお願いします!!!

4

7 に答える 7

2

家族の実体の使用についてはまったく疑問があります。離婚とその後の両親の再婚により、子供は2つの家族の一員になることができます。それをどのようにモデル化しますか?子供には、「ロコパレンティス」で効果的に行動する4人がいないのではないでしょうか。

于 2012-04-27T13:33:58.797 に答える
2

子供が持つことができる親は 2 人までであり、どちらも特定の役割 (母親と父親) を持ち、一方または両方の親が不明な状況が発生する可能性があります。

したがって、これは実際の「多対多」の関係ではなく、実際には「多対ゼロまたは 1 または 2」であり、次のように自然に表すことができます (MotherIDとの両方FatherIDが NULL 可能です)。

ここに画像の説明を入力

and (またはあなたの場合は共通のスーパークラス) のLastName両方を入れると、親が子供とは異なる姓を持っている状況も自然にカバーされます。ParentPlayer

次に、このように「親ごとの子」を簡単に取得できます( SQL Fiddle )...

SELECT
    ParentID,
    Parent.FirstName ParentFirstName,
    Parent.LastName ParentLastName,
    PlayerID,
    Player.FirstName PlayerFirstName,
    Player.LastName PlayerLastName
FROM
    Parent
    LEFT JOIN Player
        ON Parent.ParentID = Player.MotherID
        OR Parent.ParentID = Player.FatherID
ORDER BY ParentId

...必要に応じて、アプリケーション コードでデータをピボットします。


Parent上記のモデルでは、の性別と母親/父親の役割の不一致が許容されます。これを防ぎたい場合は、船外に出て、次のようなことを行うことができます...

ここに画像の説明を入力

...しかし、複雑にして最初のモデルに固執し、これをアプリケーション レベルで強制するのは避けたいと思います。

于 2012-04-27T11:50:08.507 に答える
1

必要なのは、子供、介護者の 2 つのフィールドを持つ結合テーブルだけです。それは本質的にあなたが「家族」テーブルのために持っているものです - 私はあなたの「親」テーブルの目的を理解していません。「家族」の両方の値は、「人」への外部キーになります (つまり、「プレーヤー」をダイアグラムにあるよりも一般的なテーブルにします)。

これにより、どの子供も何人もの介護者を持つことができます。そして、任意の数の子供にリンクされる任意の介護者。ひねくれた家族構成と素晴らしい家族構成のすべての可能な組み合わせが受け入れられます。

于 2012-04-27T23:05:30.353 に答える
0

人が複数のアドレスを持っている理由はわかりませんが、可能だと思います。ただし、複数のアドレスを処理している場合は、そのアドレスを別のテーブルにプッシュして、テーブルに参加する person_address を作成します。そうすれば、同じ住所に住むすべての人に対して住所データを繰り返すことにはなりません。

親テーブルには 2 つのフィールドが必要です。1 つは親用、もう 1 つはプレーヤー用です (前述のように、両方とも人を指している方がうまくいくと思います)。親とプレイヤーの間に 2 つの関係線があるのはなぜですか?

person|parent の関係は 1..1 - 1..1 ではありません。これは、すべての人が親であることを意味するためです。プレイヤーはおそらくそうではありません。

余談ですが、あなたは本当に母親と父親に執着しているようですね。いずれかが存在しない場合と複数存在する場合があります。性別を規定する個別の関係は必要ありません。これは、PERSON のデータであるか、まったく無関係である必要があります。

于 2012-04-28T07:15:08.387 に答える
0

うーん、これは痛すぎる。あなたはそれを複雑にしすぎています。私はvisioを持っていないので、対処してみてください:

  • PERSON(person_id, first_name, last_name) PK: person_id
  • FAMILY(親,プレイヤー) PK:(親,プレイヤー) FK:FAMILY.parent -> PERSON.person_id, FK:player->PERSON.person_id

それだけです-簡単です。

必要なのは、2 人の異なる人物が一緒に一致するテーブルだけです。子供の世話をするすべての人を見つけるには、個人と個人を結合し、その子供をフィルタリングします。

住所:

  • PERSON_ADDRESS(person_id,address_id) PK:(person_id,address_id) FK:person_id->person.person_id, FK:address_id->address.address_id
  • ADDRESS(address_id,st-num,street, city,phone) PK:address_id st-num は 23B のような英数字の場合があります

実は、あなたが電話番号を住所に入れるのは気が進まないのです。住所内の複数の電話番号には対応していません。しかし、アドレスは気を散らすものです。あなたの問題は、プレーヤーを親にリンクすることに関するようです。

学校はそれ自身のテーブルであるべきです。school_id を person に入れるか、null が嫌いな場合は、子供用のレコードのみを持つ結合テーブル person_school を用意します。

于 2012-04-28T08:08:26.367 に答える
0

多対多の関係を実装する Family テーブルは、通常、ユーザーが親/プレーヤーのデータを入力した後に作成されます。UI は通常、親がメイン フォームから入力/選択され、親に関連付けられた 1 人以上のプレイヤーがサブフォームに入力/表示されるメイン フォーム/サブフォームの組み合わせとして表されます。通常は何らかのグリッドです。

于 2012-04-27T06:19:33.273 に答える
0

これ自体が「答え」であるかどうかはわかりませんが、これは私のMySQLコードをBranko Dimitrijevicの答えが私に提供したものに合うように調整しようとする私の試みです. 関連するテーブルの調整されたMySQLコードは次のとおりです。

DROP TABLE IF EXISTS `person` ;
CREATE TABLE `person` (
  `personID` INT(5) NOT NULL AUTO_INCREMENT ,
  `firstName` VARCHAR(50) NOT NULL ,
  `lastName` VARCHAR(50) NOT NULL ,
  `dateOfBirth` DATE NOT NULL ,
  `personType` CHAR(6) NOT NULL, 
  `photo` BLOB NULL DEFAULT NULL ,
  PRIMARY KEY (`personID`))
ENGINE = InnoDB;
SHOW WARNINGS;

DROP TABLE IF EXISTS `parent` ;
CREATE TABLE `parent` (
  `parentID` INT(5) NOT NULL,
  PRIMARY KEY (`parentID`), 
  FOREIGN KEY (`parentID`) REFERENCES `person` (`personID`) 
  ON DELETE CASCADE 
  ON UPDATE CASCADE)
ENGINE = InnoDB;
SHOW WARNINGS;

DROP TABLE IF EXISTS `player` ;
CREATE TABLE Player (
    `playerID` INT(5) NOT NULL,
    `motherID` INT(5),
    `fatherID` INT(5),
    `schoolID` INT(5),
    PRIMARY KEY (`playerID`), 
    FOREIGN KEY (`playerID`) REFERENCES `person` (`personID`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE,
    FOREIGN KEY (`motherID`) REFERENCES `parent` (`parentID`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE,
    FOREIGN KEY (`fatherID`) REFERENCES `parent` (`parentID`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
    FOREIGN KEY (`schoolID`) REFERENCES `school` (`schoolID`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE)
ENGINE = InnoDB;
SHOW WARNINGS;

これは、これらのテーブルを含む論理モデルの一部です。

ここに画像の説明を入力

ブランコ、または他の誰かが、ブランコの答えで私の試みを検証できれば、それは良いことです. また、画像では、モデルに MySQL Workbench を使用していることに気付くでしょう。

以下は、この特定の問題の範囲外ですが、誰かがこれを手伝ってくれるなら、それは素晴らしいことです:

SQL コードをモデル スキーマなどに変換するためにリバース エンジニアリングまたはフォワード エンジニアリングを使用しないように求められましたが、これにより、Visio で構築したモデルの正確性を検証することができました。ただし、Visio モデルを Workbench モデルのように見せることはできません。上記のようにモデル化しようとしているテーブルの Visio バージョンは次のとおりです。

ここに画像の説明を入力

Visio バージョンでわかるように、"fatherID" 列と "motherID" 列は外部キーとして示されていません。誰かが私の Visio モデルを Workbench バージョンと同じに見えるようにするのを手伝ってくれるなら、それは良いことです。

于 2012-04-28T01:42:19.557 に答える