MySQL 中的表布局


Table layout in MySQL

我正在夜间课程中学习php/mysql,发现很难弄清楚我应该如何在数据库中布局和构建我的表格,无论我花多长时间做笔记并试图解决它,我都做不到。

我正在尝试创建一个搜索页面,用户可以在其中按国家或地区搜索图片,但显然许多国家/地区将具有相同的区域。

我没有将图片存储在数据库中,只是将网址存储在 url 中,但我无法弄清楚如何将表格连接在一起。

我得到的最远的是带有 id 和名称列的国家/地区表,一个带有 id 和名称列的区域表,一个连接两者的可连接表,具有 country_id 和 region_id 列,但我无法弄清楚如何将表格与图片 url 合并,以便可以按地区或国家/地区搜索它们。

我知道用于构建页面的 php,我只是在寻找有关如何构建数据库部分的帮助。

任何帮助将不胜感激,我花了几个小时试图解决这个问题。

提前谢谢。

尝试这样的事情:

Regions
-------
region_id
name
Countries
---------
country_id
name
region_id
Pictures
--------
picture_id
url
country_id

如果某些图片只有一个地区而没有一个国家/地区,请向Pictures添加一个region_id,并将其与 country_id 一起设为空。

要进行选择,只需使用具有相同名称的列进行联接,如下所示:

select url
from pictures p
join countries c on p.country_id = c.country_id
join regions r on r.region_id = c.region_id

并增加相关的where条款:

where c.name = 'UK'

where r.name = 'Europe'

等等。

这个答案做了以下假设:

  • regionscountries具有相同的结构
  • countries只属于一个region
  • 图像仅标记为一个countryregion

使用第一个假设,即regionscountries实际上是相同的,我们将有一个包含此CREATE语句的表。

CREATE TABLE `locations` (
    `id` INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
    `name` VARCHAR(255) NOT NULL DEFAULT '',
    `type` VARCHAR(255) NOT NULL DEFAULT '', -- This will be 'region' or 'country'
    `parent_id` INTEGER NULL DEFAULT NULL
    -- Insert your other fields here...
);

然后我们会有images的表格

,如下所示
CREATE TABLE `images` (
    `id` INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
    `file_path` VARCHAR(255) NOT NULL DEFAULT '',
    `location_id` INTEGER NOT NULL DEFAULT 0, -- This will probably be a country.
    -- Your Other fields here...
);

现在要通过regioncountry搜索图像,我们只需要传入location_id即可获得该特定位置。

这里重要的部分是locations parent_id,我们可以使用此字段进行查询以获取区域内的所有国家/地区。

如果我们有一个id = 8的区域,我们可以执行以下操作:

SELECT i.*
FROM `locations` AS l
INNER JOIN `images` AS i ON i.location_id = l.id
WHERE l.id = 8
OR l.parent_id = 8

然后,这将为我们提供直接附加到区域 8 或属于区域 8 的国家/地区的任何图像。

对于一个国家,我们可以进行完全相同的搜索,但假设countries直接附加到regions我们只会将图像附加到该国家/地区,从而为我们提供正确的结果,但如果您愿意,您当然可以添加AND l.type = 'region'

希望我的答案足够清楚。