2017-02-17 3 views
0

グループの複数のメンバーをモデル化するにはどうすればよいですか?例を挙げましょう。グループの複数のメンバーをモデル化するにはどうすればいいですか?

私は人、家、および家庭用品を持っています。

すべての家屋は1人で所有され、1人は複数の家を所有することができます。

すべての家庭用品は一戸建てにあり、家の所有者が所有しています。私の特別な状況では、特定の人が所有するすべての家庭用品のインクリメンタルカウンターが好きです。

さらに、すべての家庭用品はいくつかの特性を共有していますが、家庭用品の種類に基づいていくつかの特性も持っています。ウォーターベッド、テレビ、冷蔵庫などの家庭用品は数種類しかないと仮定します。家計のアイテムを別のテーブルにリンクすることも可能でなければならないことに注意してください(例:家のアイテムのタイプに関係なく、家のアイテムには外部キーが必要です)。

したがって、住宅はグループであり、世帯アイテムはそのグループのメンバーです。

これはどのようにモデル化する必要がありますか?次の2つの可能性があります。上記の規則を与えられた他のものよりも優れていますか?私は、InnoDBでプライマリキーをインクリメントするハウスコンポジットの最初のオプションはうまくいきませんが、受け入れ可能なトリガなどで実装できることを認識しています。または、おそらく3番目のオプションが良いですか?テーブル名、退屈で、不要な取得とカラム名を前置

enter image description here

-- MySQL Script generated by MySQL Workbench 
-- 02/16/17 16:01:38 
-- Model: New Model Version: 1.0 
SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; 

-- ----------------------------------------------------- 
-- Schema mydb 
-- ----------------------------------------------------- 
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ; 
USE `mydb` ; 

-- ----------------------------------------------------- 
-- Table `mydb`.`people` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `mydb`.`people` (
    `idpeople` INT NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(45) NOT NULL, 
    `age` INT NOT NULL, 
    PRIMARY KEY (`idpeople`)) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `mydb`.`houses` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `mydb`.`houses` (
    `idhouses` INT NOT NULL AUTO_INCREMENT, 
    `people_idpeople` INT NOT NULL, 
    `address` VARCHAR(45) NOT NULL, 
    `square_feet` INT NOT NULL, 
    PRIMARY KEY (`idhouses`), 
    INDEX `fk_houses_people1_idx` (`people_idpeople` ASC), 
    CONSTRAINT `fk_houses_people1` 
    FOREIGN KEY (`people_idpeople`) 
    REFERENCES `mydb`.`people` (`idpeople`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `mydb`.`houseHoldItems` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `mydb`.`houseHoldItems` (
    `idhouseHoldItems` INT NOT NULL AUTO_INCREMENT, 
    `houses_idhouses` INT NOT NULL, 
    `value` DECIMAL(6,2) NOT NULL, 
    `dateBought` DATETIME NOT NULL, 
    PRIMARY KEY (`idhouseHoldItems`, `houses_idhouses`), 
    INDEX `fk_houseHoldItems_houses_idx` (`houses_idhouses` ASC), 
    CONSTRAINT `fk_houseHoldItems_houses` 
    FOREIGN KEY (`houses_idhouses`) 
    REFERENCES `mydb`.`houses` (`idhouses`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

-- ----------------------------------------------------- 
-- Table `mydb`.`waterBeds` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `mydb`.`waterBeds` (
    `houseHoldItems_idhouseHoldItems` INT NOT NULL, 
    `houseHoldItems_houses_idhouses` INT NOT NULL, 
    `gallonsWaterSize` INT NOT NULL, 
    PRIMARY KEY (`houseHoldItems_idhouseHoldItems`, `houseHoldItems_houses_idhouses`), 
    CONSTRAINT `fk_waterBeds_houseHoldItems1` 
    FOREIGN KEY (`houseHoldItems_idhouseHoldItems` , `houseHoldItems_houses_idhouses`) 
    REFERENCES `mydb`.`houseHoldItems` (`idhouseHoldItems` , `houses_idhouses`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `mydb`.`televisions` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `mydb`.`televisions` (
    `houseHoldItems_idhouseHoldItems` INT NOT NULL, 
    `houseHoldItems_houses_idhouses` INT NOT NULL, 
    `screenSize` INT NOT NULL, 
    `brandName` VARCHAR(45) NOT NULL, 
    PRIMARY KEY (`houseHoldItems_idhouseHoldItems`, `houseHoldItems_houses_idhouses`), 
    CONSTRAINT `fk_televisions_houseHoldItems1` 
    FOREIGN KEY (`houseHoldItems_idhouseHoldItems` , `houseHoldItems_houses_idhouses`) 
    REFERENCES `mydb`.`houseHoldItems` (`idhouseHoldItems` , `houses_idhouses`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `mydb`.`refrigerators` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `mydb`.`refrigerators` (
    `houseHoldItems_idhouseHoldItems` INT NOT NULL, 
    `houseHoldItems_houses_idhouses` INT NOT NULL, 
    `icecubeCapacity` INT NOT NULL, 
    `color` VARCHAR(45) NOT NULL, 
    PRIMARY KEY (`houseHoldItems_idhouseHoldItems`, `houseHoldItems_houses_idhouses`), 
    CONSTRAINT `fk_refrigerators_houseHoldItems1` 
    FOREIGN KEY (`houseHoldItems_idhouseHoldItems` , `houseHoldItems_houses_idhouses`) 
    REFERENCES `mydb`.`houseHoldItems` (`idhouseHoldItems` , `houses_idhouses`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


SET [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 

enter image description here

-- MySQL Script generated by MySQL Workbench 
-- 02/16/17 16:00:37 
-- Model: New Model Version: 1.0 
SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; 

-- ----------------------------------------------------- 
-- Schema mydb 
-- ----------------------------------------------------- 
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ; 
USE `mydb` ; 

-- ----------------------------------------------------- 
-- Table `mydb`.`people` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `mydb`.`people` (
    `idpeople` INT NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(45) NOT NULL, 
    `age` INT NOT NULL, 
    PRIMARY KEY (`idpeople`)) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `mydb`.`houses` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `mydb`.`houses` (
    `idhouses` INT NOT NULL AUTO_INCREMENT, 
    `people_idpeople` INT NOT NULL, 
    `address` VARCHAR(45) NOT NULL, 
    `square_feet` INT NOT NULL, 
    PRIMARY KEY (`idhouses`), 
    INDEX `fk_houses_people1_idx` (`people_idpeople` ASC), 
    CONSTRAINT `fk_houses_people1` 
    FOREIGN KEY (`people_idpeople`) 
    REFERENCES `mydb`.`people` (`idpeople`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `mydb`.`houseHoldItems` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `mydb`.`houseHoldItems` (
    `idhouseHoldItems` INT NOT NULL AUTO_INCREMENT, 
    `houses_idhouses` INT NOT NULL, 
    `uniqueKey` INT NOT NULL, 
    `value` DECIMAL(6,2) NOT NULL, 
    `dateBought` DATETIME NOT NULL, 
    PRIMARY KEY (`idhouseHoldItems`), 
    INDEX `fk_houseHoldItems_houses1_idx` (`houses_idhouses` ASC), 
    UNIQUE INDEX `unique_key` (`houses_idhouses` ASC, `uniqueKey` ASC), 
    CONSTRAINT `fk_houseHoldItems_houses1` 
    FOREIGN KEY (`houses_idhouses`) 
    REFERENCES `mydb`.`houses` (`idhouses`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `mydb`.`waterBeds` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `mydb`.`waterBeds` (
    `gallonsWaterSize` INT NOT NULL, 
    `houseHoldItems_idhouseHoldItems` INT NOT NULL, 
    PRIMARY KEY (`houseHoldItems_idhouseHoldItems`), 
    CONSTRAINT `fk_waterBeds_houseHoldItems1` 
    FOREIGN KEY (`houseHoldItems_idhouseHoldItems`) 
    REFERENCES `mydb`.`houseHoldItems` (`idhouseHoldItems`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `mydb`.`televisions` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `mydb`.`televisions` (
    `screenSize` INT NOT NULL, 
    `brandName` VARCHAR(45) NOT NULL, 
    `houseHoldItems_idhouseHoldItems` INT NOT NULL, 
    PRIMARY KEY (`houseHoldItems_idhouseHoldItems`), 
    CONSTRAINT `fk_televisions_houseHoldItems1` 
    FOREIGN KEY (`houseHoldItems_idhouseHoldItems`) 
    REFERENCES `mydb`.`houseHoldItems` (`idhouseHoldItems`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `mydb`.`refrigerators` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `mydb`.`refrigerators` (
    `icecubeCapacity` INT NOT NULL, 
    `color` VARCHAR(45) NOT NULL, 
    `houseHoldItems_idhouseHoldItems` INT NOT NULL, 
    PRIMARY KEY (`houseHoldItems_idhouseHoldItems`), 
    CONSTRAINT `fk_refrigerators_houseHoldItems1` 
    FOREIGN KEY (`houseHoldItems_idhouseHoldItems`) 
    REFERENCES `mydb`.`houseHoldItems` (`idhouseHoldItems`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


SET [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 
+0

家庭用アイテムにEAVモデルを採用する方が簡単だと思うかもしれませんが、それも問題のラフトをもたらす可能性があるので、あなたのアプローチは大丈夫だと思います。そのキーは増分しています。 – Strawberry

+0

@Strawberry EAVモデルでない場合は、2番目のオプションをお勧めしますか?ただし、 'householdItems'フィールドには追加のフィールドが必要ですが、特定の家計アイテムテーブルの列が削除され、少し簡単に参加できます。なぜあなたはこのような理由があるのでしょうか? – user1032531

答えて

0

EAVは悪い方法ですが、冷蔵庫とテレビ用に別々のテーブルを用意するよりも優れています。私が追加したタグに従ってください。一番下の行:MySQLで操作する必要のある列の列に、残りの部分を単一のJSON列にスローします。

"many:many"テーブルについては、my tipsを参照してください。

+1

私は時々EAVが理にかなっていると思っていますが、現状と将来の要件を確実に軽視してはいけません。 – user1032531

関連する問題