使用 MySQL (phpmyadmin) 了解主键和关系数据库
Posted
技术标签:
【中文标题】使用 MySQL (phpmyadmin) 了解主键和关系数据库【英文标题】:Understanding Primary Key and Relationship Databases with MySQL (phpmyadmin) 【发布时间】:2016-03-26 22:05:02 【问题描述】:预警 - 从一开始就可能出现问题。不止一件事。非常感谢我提出的问题之外的任何其他帮助:)
另外,admin_tbl 可以忽略。它只是网站管理员的用户名/密码。
目标(和问题):创建两个关系表。使用我的 html 表单,我希望能够插入以下信息:
专辑名称 - 探索 名称 - 死海 时间日期 - 2015-12-21 评论 - 以色列死海的美丽风景。 上传图片 - (选择图片的按钮)
我已经设法创建代码(php 和 sql 文件)将信息上传到数据库并将图像上传到“上传”文件夹。但是,目的是让每个相册都有一个 ID (albumID),并且能够上传多张图像并成为一个相册的一部分(当然还有多个相册,每个相册都有不同的图像)。 你能帮我做这件事吗?
我目前所拥有的:
'image_tbl' - - 存储图片路径和表单信息(包括专辑名称)的表
'album_tbl' - - 存储专辑ID和专辑名称的表
问题(我遇到过):
image_tbl - 如您所见,我插入数据库的每张图片都有一个 id,它是自动递增的。显然,自动递增的 id(不确定官方术语)必须是主键。但是,要让albumName(在此表中)在album_tbl 中有关系,它不需要是主键吗?
album_tbl - 在这张表中,我有专辑 ID 和专辑名称。我想要的是,当插入带有专辑名称(例如“探索”)的表单时,它也被赋予专辑 ID。因此,如果我打印一个特定的“albumID”,每张放入其中的图像都会显示出来。
希望一切都可以理解。
附:如果您需要任何其他信息,请询问,如果您有建议可以更轻松/更有效地执行此操作,请告诉我!
P.p.s 如果可以快速完成,有人可以解释一下我的表格上下文中的“索引”选项是什么(以便易于理解),谢谢!
【问题讨论】:
【参考方案1】:TL;DR您不需要声明要查询的“关系”,即外键(FK)。但这是一个好主意。当您这样做时,FK 可以引用主键 (PK)或任何其他 UNIQUE 列。
在某些方法和产品中,PK 和 FK 被错误地称为“关系”。应用程序关系由表表示。 (基表和查询结果。) PK 和 FK 是约束:它们告诉 DBMS 只有某些情况会出现,因此它可以在您出现某些错误时注意到。它们不是关系,它们是在每个数据库状态和应用程序情况下的真实陈述。 You do not need to know constraints to update and query a database.
Just know what every table means. 基表具有 DBA 赋予的含义,可以告诉您它们的行的含义。查询也有一些含义,可以告诉您它们的行是什么意思。查询含义与基表含义相结合,其结果值如何与基表值和条件相结合。
image_tbl
-- 图片 [Id] 在名为 [albumName] 的相册中,名为 [name],日期为 [dateTime] 并且有评论 [comment]
album_tbl
-- 专辑 [albumID] 被命名为 [albumName]
您没有有声明任何 PK/UNIQUE 或 FK!但这是一个好主意,因为 DBMS 可以禁止不可能/错误的更新。 PK/UNIQUE 表示其列的子行值只能出现一次。 FK 表示其列的子行值必须在其引用的表中显示为 PK/UNIQUE 子行值。这些限制存在于基表上的事实意味着某些限制存在于查询结果中。但是这些查询结果的含义取决于查询的表和条件组合,与这些限制无关。例如专辑名称是否唯一,
image_tbl JOIN album_tbl USING albumName
-- 图像 [Id] 在名为 [albumName] 的专辑中,名为 [name],日期为 [dateTime] 并有评论 [comment] 并且专辑 [albumID] 名为 [albumName]
这里唯一的问题是,如果专辑名称不是唯一的,那么知道图像的专辑名称并不能告诉您它在哪个专辑中;你只知道它在同名的专辑中。另一方面,如果专辑名称是唯一的,则不需要album_tbl 专辑ID。
因此,如果专辑名称是唯一的,请在 album_tbl 中声明专辑名称 UNIQUE。然后在 image_tbl 中通过album_tbl 的一些PK/UNIQUE 列来识别专辑。由于可能只是为了识别专辑而存在专辑 ID,因此通常我们希望选择它。然后在 image_tbl 中将该列声明为引用 album_tbl 的 FK。
PS 索引通常会以一些时间和空间为代价来加快查询速度。表声明中的主键声明自动声明索引。索引 PK、UNIQUE 和 FK 列集是个好主意。
【讨论】:
【参考方案2】:欢迎使用关系数据库。 关系数据库的想法是让所有数据相互关联,但要避免数据复制。这称为规范化。
在您的示例中,您正在两个表中复制“专辑名称”名称,这不是必需的。您要做的是将列专辑名称(在 image_tbl 中)更改为专辑 ID,并在 album_id
.image_tbl
上添加一个外键到 album_id
。 album_tbl
。
【讨论】:
关系模型不关心值是 id 还是字符串。您的建议与规范化无关。但是,如果专辑名称在 album_tbl 中不是 UNIQUE/PK,那么是的,FK 应该是 album_id。以上是关于使用 MySQL (phpmyadmin) 了解主键和关系数据库的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Phpmyadmin 中使用主键和外键创建关系数据库?
在 xampp 上使用 phpmyadmin 进行 mysql 数据库复制