MYSQL表用于另一个表中的相关记录

时间:2015-02-02 17:54:40

标签: mysql

使用表来维护另一个表的相关记录的最佳方法是什么。

示例:

mytbl
-----
id   sku

1    sk1
2    sk2
3    sk3
4    sk4
5    sk5
6    sk6
7    sk7

让我们说记录1,4和3是“相关的” 所以我想保持一张表告诉我他们是。

relatedTbl
----------
sku   related_sku

sk1  sk3
sk1  sk4
sk3  sk4

此解决方案可行,但有更好的解决方案吗?

编辑:我在relatedTbl中使用了skus,但我知道我可以(更好)使用id。问题是关于表的结构而不是使用的外键。

2 个答案:

答案 0 :(得分:1)

您有正确的解决方案。如您所示,使用ID。如果sku是唯一的,请考虑将其用作天然PK。

CREATE TABLE IF NOT EXISTS `mytbl` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `sku` VARCHAR(45) NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `relatedTbl` (
  `mytbl_id` INT UNSIGNED NOT NULL,
  `mytbl_id1` INT UNSIGNED NOT NULL,
  PRIMARY KEY (`mytbl_id`, `mytbl_id1`),
  INDEX `fk_mytbl_has_mytbl_mytbl1_idx` (`mytbl_id1` ASC),
  INDEX `fk_mytbl_has_mytbl_mytbl_idx` (`mytbl_id` ASC),
  CONSTRAINT `fk_mytbl_has_mytbl_mytbl`
    FOREIGN KEY (`mytbl_id`)
    REFERENCES `mytbl` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_mytbl_has_mytbl_mytbl1`
    FOREIGN KEY (`mytbl_id1`)
    REFERENCES `mytbl` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

答案 1 :(得分:0)

您可能需要考虑在“mytbl”中添加第三个字段,以存储常用记录的唯一键。例如,字段3将被命名为“uniqID”,而记录1,4和3将与该表“相关”:

MYTBL

id sku uniqID

1 sk1 1

2 sk2

3 sk3 1

4 sk4 1

5 sk5

6 sk6

7 sk7

然后,您可以在select语句的末尾使用'WHERE uniqID = 1'子句来获取公共属性