添加数据库"子表"每个元素

时间:2015-08-10 18:44:54

标签: php mysql

我不确定"子表"是适当的术语,所以让我解释一下。

我正在设置一个包含多个项目的网站,现在我在我的MySQL数据库中创建了两个独立的表:generalplatforms

我现在的目标是将每个项目的数据拆分成这两个表,到目前为止工作正常,但我现在的问题如下:

platforms表具有以下结构:

ID
Name
URL

我希望通过ID跟踪每个项目,因此ID item #1在所有表格中应该相同。

现在,如果我为item #1说了3个不同的平台,我会在platforms表格中添加每个元素,但他们的ID不要#&# 39; t匹配。

如果我有多个项目,每个项目都有多个平台,那么它将开始变得非常混乱。

是否可以有一个看起来像这样的表?

ID
    Name
    URL

How it currently is How I want it

希望图像基本澄清它;我想要一个将多个元素组合在一起的表。

这是可能的,还是我必须通过为每个项目分配辅助非自动递增ID并在PHP中手动将平台分组在一起来实现?

1 个答案:

答案 0 :(得分:2)

看起来你有一对多的关系。一般来说,这意味着

general中的一行可以与platforms中的零行,一行或多行相关联。

platforms中的一行与general中的一行完全相关。

要实现此设计,请将id表中的general值存储为platforms表中的外键

id
general_id    -- foreign key references id in general table
name
url

两个表中的行由于共同的值而相关。

  id  general_id  name        url
 ---  ----------  ---------  --------------------------
  77           1  Platform1  http://item1.com/platform1
  78           1  Platform2  http://item1.com/platform2
  79           1  Platform3  http://item1.com/platform3

要使数据库强制引用完整性,您需要使用支持该引用的存储引擎(例如InnoDB),并且可以声明约束

ALTER TABLE `platforms` ADD 
 `general_id`  INT NOT NULL COMMENT 'fk ref general.id' AFTER `id`;

general_id列的数据类型必须与id表中general列的数据类型完全匹配。)

在强制执行约束之前,新general_id列中的值必须与引用列中的值匹配。

定义约束:

ALTER TABLE `platforms`
  ADD CONSTRAINT FK_platforms_general
  FOREIGN KEY (`general_id`) REFERENCES `general`(`id`)