Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用MySQL(phpmyadmin)了解主键和关系数据库_Mysql_Database_Phpmyadmin_Foreign Keys_Primary Key - Fatal编程技术网

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

使用MySQL(phpmyadmin)了解主键和关系数据库,mysql,database,phpmyadmin,foreign-keys,primary-key,Mysql,Database,Phpmyadmin,Foreign Keys,Primary Key,预警-从一开始就可能出现问题。不止一件事。我将非常感谢您在我提出的问题之外提供的任何其他帮助:) 此外,管理tbl也可以忽略。它只是站点管理员的用户名/密码。 目标(和问题):创建两个关系表。使用我的HTML表单,我希望能够插入以下信息: albumName-探索 名称-死海 时间日期-2015-12-21 评论-以色列死海的美丽风景。 上传图像-(选择图像的按钮) 我已经设法创建代码(php和sql文件)将信息上传到数据库中,并将图像上传到“上传”文件夹中。但是,目标是每个相册都有一个ID(a

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

此外,管理tbl也可以忽略。它只是站点管理员的用户名/密码。

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

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

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

到目前为止我拥有的:

“image_tbl”-存储图像路径和表单信息(包括相册名称)的表

“album_tbl”-存储albumID和albumName的表

问题(我遇到过):

image_tbl-正如您所看到的,我插入数据库的每个图像都有一个id,它是自动递增的。显然,自动递增的id(不确定官方术语)必须是主键。但是,要使albumName(在此表中)在album_tbl中具有关系,它不需要是主键吗

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

希望一切都可以理解

另外,如果你需要任何额外的信息,请询问,如果你有更简单/更有效的建议,请告诉我


p.p.s如果可以很快完成,请有人解释一下在我的表格上下文中“索引”选项是什么(这样很容易理解),谢谢

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


在您的示例中,您正在两个表中复制“Album Name”名称,这是不必要的。您要做的是将列Album Name(在image\u tbl中)更改为Album ID,并在
Album\u ID
image\u tbl
上添加外键到
Album\u ID
<代码>相册\u tbl

TL;DR您不需要声明要查询的“关系”,即外键(FK)。但这是个好主意。当您这样做时,FK可以引用主键(PK)或任何其他唯一列


PKs和FKs在某些方法和产品中被错误地称为“关系”。应用程序关系由表表示。(基表和查询结果)PKs和FK是约束:它们告诉DBMS只能出现某些情况,因此当您出现某些错误时,DBMS会注意到。它们不是关系,它们是每个数据库状态和应用程序情况中的真实语句

基表具有DBA给定的含义,可以告诉您它们的行的含义。查询的含义还可以告诉您其行的含义。查询含义是从基表含义组合而来的,与它们的结果值是如何从基表值和条件组合而来的并行

  • image\u tbl
    ——image[Id]位于名为[albumName]的相册中,名为[name],日期为[dateTime],并有注释[comment]
  • 相册\u tbl
    ——相册[albumID]命名为[albumName]
您不必声明任何PKs/UNIQUEs或FKs!但这是一个好主意,因为这样DBMS就可以禁止不可能的/错误的更新。PK/UNIQUE表示其列的subrow值只能出现一次。FK表示,其列的子程序值必须在其引用的表中显示为PK/唯一子程序值。这些限制适用于基表这一事实意味着某些限制适用于查询结果。但是,这些查询结果的含义取决于查询的表和条件组合,与这些限制无关。例如专辑名称是否唯一

  • image\u tbl加入相册\u tbl使用albumName
    ——image[Id]位于名为[albumName]的相册中,名为[name],日期为[dateTime],并有注释[comment],相册[albumID]名为[albumName]
这里唯一的问题是,如果相册名称不是唯一的,那么知道图像的相册名称并不能告诉你它在哪个相册中;你只知道它在一张同名的专辑里。另一方面,如果相册名称是唯一的,则不需要相册ID

因此,如果相册名称是唯一的,请在相册中声明相册名称唯一。然后在图中,通过相册的某个PK/唯一列来识别相册。由于相册_id可能只是为了识别相册而存在,通常我们希望它被选中。然后在图像中,将该列声明为引用相册的FK


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

关系模型不关心值是id还是字符串。你的建议与正常化无关。但是如果相册名称在相册中不是唯一的/PK,则FK应该是相册id。