使用 MySQL 了解主键和关系数据库 (phpmyadmin)

Understanding Primary Key and Relationship Databases with MySQL (phpmyadmin)

预警 - 从一开始就可能出现问题。不止一件事。在我提出的问题之外的任何其他帮助将不胜感激:)

另外,admin_tbl可以忽略。对于站点管理员来说,它只是usernames/passwords。

目标(和问题): 建立两个关系 table。使用我的 HTML 表单,我希望能够插入如下信息:

专辑名称 - 探索
名称 - 死海
时间日期 - 2015-12-21
评论 - 以色列死海的美丽风景。
上传图片 -(选择图片的按钮)

我已设法创建代码(php 和 sql 文件)将信息上传到数据库并将图像上传到 'Uploads' 文件夹。但是,目的是让每个相册都有一个 ID (albumID),并且能够上传多张图像并成为一个相册的一部分(当然还有多个相册,每个相册中都有不同的图像)。 你能帮我做这个吗?

我目前有:

'image_tbl' - - Table 存储图像路径和来自表单的信息(包括相册名称)

'album_tbl' - - Table 存储albumID,然后是albumName

问题(我已经运行入):

image_tbl - 如您所见,我插入数据库的每张图片都有一个 ID,该 ID 会自动递增。显然,自动递增的 id(不确定官方术语)必须是主键。但是,要让 albumName(在 table 中)在 album_tbl 中有关系,它不需要是主键吗?

album_tbl - 在这个 table 中,我有 albumID 和 albumName。我想要的是,当插入带有 albumName(例如“探索”)的表单时,它也会被赋予 albumID。因此,如果我打印一个特定的 'albumID' 放置在其中的每个图像都会显示。

希望一切都明白。

P.s。如果您需要任何其他信息,请直接询问,如果您有建议easier/more 高效地执行此操作,请告诉我!

P.p.s 如果可以快速完成,有人可以解释一下 'Index' 选项在我的 table 上下文中的含义吗(这样很容易理解),谢谢!

欢迎使用关系数据库。
关系数据库的想法是让所有数据相互关联,但要避免数据复制。这称为规范化。

在您的示例中,您在两个表中都复制了 "Album Name" 名称,这不是必需的。您要做的是将专辑名称列(在 image_tbl 中)更改为专辑 ID,并在 album_id.image_tbl 上添加一个外键到 album_idalbum_tbl

TL;DR 您不需要 声明"relationship" 即外键 (FK) 来查询。但这是一个 好主意 。当您这样做时,FK 可以引用主键 (PK) 任何其他 UNIQUE 列。


PK 和 FK 在某些方法和产品中被错误地称为 "relationships"。应用关系用tables表示。 (基础 table 和查询结果。)PK 和 FK 是约束:它们告诉 DBMS 只有某些情况会出现,因此当您犯了某些错误时它会注意到。它们不是关系,它们是每个数据库状态和应用程序情况下的真实陈述。 You do not need to know constraints to update and query a database.

Base tables 具有 DBA 赋予的含义,告诉您它们的行的含义。查询还具有告诉您它们的行的含义的含义。查询含义由基本 table 含义组合而成,与它们的结果值如何从基本 table 值和条件组合而成。

  • image_tbl -- 图片 [Id] 在名为 [albumName] 的相册中,名为 [name],日期为 [dateTime] 并且有评论 [comment]
  • album_tbl -- 专辑 [albumID] 名为 [albumName]

没有声明任何PKs/UNIQUEs或FK!但这是一个 好主意 因为 DBMS 可以禁止 impossible/erroneous 更新。 PK/UNIQUE 表示其列的子行值必须只出现一次。 FK 表示其列的子行值必须在其引用的 table 中显示为 PK/UNIQUE 子行值。这些限制适用于基础 table 的事实意味着某些限制适用于查询结果。但这些查询结果的含义是根据查询的 table 和条件组合确定的,与这些限制无关。例如专辑名是否唯一,

  • image_tbl JOIN album_tbl USING albumName -- 图片 [Id] 在名为 [albumName] 的相册中,名为 [name],日期为 [dateTime] 并且有评论 [comment] 并且相册 [albumID] 名为 [专辑名称]

这里唯一的问题是,如果相册名称不是唯一的,那么知道图像的相册名称并不能告诉您它在哪个相册中;您只知道它在同名专辑中。另一方面,如果专辑名称是唯一的,则不需要 album_tbl albumID。

因此,如果专辑名称是唯一的,请在 album_tbl 中声明 albumName UNIQUE。然后在 image_tbl 中通过 album_tbl 的某些 PK/UNIQUE 列识别相册。由于 album_id 可能只是为了识别专辑而存在,通常我们会期望它被选中。然后在 image_tbl 中将该列声明为 FK 引用 album_tbl.

PS 索引通常以一些时间和 space 为代价来加快查询速度。 table 声明中的主键声明会自动声明一个索引。索引 PK、UNIQUE 和 FK 列集是个好主意。