mysql - MySQL 数据库中的多种关系

标签 mysql sql database foreign-keys relational-database

作为我学校科目的入门项目,我被要求创建一个应用程序来显示我所在国家/地区的商店列表,并可以按位置和类别对其进行排序。更重要的是,它不应该只是静态文本,因为用户可以将他/她自己的商店添加到列表中。

虽然我的 Java 应用程序的 UI 和功能没有遇到任何问题,但我对数据库,特别是 MySQL 来说是一个完全的新手。尽管我已经仔细研究了一些教程,但我仍然在为一个确实原始的问题而苦苦挣扎。

问题是:

我创建了一个表“Shop”,其中包含“id”(自动递增的主键)、“name”(文本类型)、“type”(文本类型)和“location”(文本类型)列。

同样,又制作了两张 table :

1) “Types”,其中再次包含“id”作为主键和“type”。例如:

id   type
1    supermarket
2    grocery
3    bookshop

2) “位置”也包含“id”和“城市”。像这样的事情:

id   city
1    London
2    Nottingham
3    Southampton

我试图做的是在“类型”/“位置”和“商店”表之间创建“多对1”关系(或在“类型”和“商店”以及“位置”之间创建“1对1”关系) ”和“商店”),因为进一步我想按位置和类型对商店进行排序,从而在我的应用程序中打印相关商店的列表。但是,我根本找不到如何实现这些连接的逻辑顺序。

期待任何提示。 提前致谢!

最佳答案

您在此处描述的两种关系都是一对多:

  • 一家商店只有一种类型。一种类型可以在许多不同的商店中使用。
  • 一家商店只有一个且只有一个地点。一个位置可用于许多不同的商店。

如果您允许商店有空的类型或位置,则需要额外考虑。为了简单起见,我们将认为这里没有发生这种情况(但可以通过使用可为空的外键来实现)。

一对多关系是通过在两个相关表之间添加外键来实现的。这是通过在子表中添加一列包含父表的 id(主键)并为这些列创建外键约束来实现的。

也就是说,您必须向 Shop 表添加 typeId 列,并在数据库中定义外键约束。与位置的关系相同:向 Shop 添加 locationId 列和外键约束。

您不应在 Shop 表中包含位置和类型名称的文本列,而只能包含 ID 的列。使用该信息进行搜索时,您将通过不同相关表之间的联接进行查询。像这样的东西:

SELECT s.name, t.type, l.city
FROM Shop s
    INNER JOIN Types t ON s.typeId = t.id
    INNER JOIN Location l ON s.locationId = l.id
WHERE t.type = 'supermarket'

有关联接的更多信息 here .

如果您已经使用外键创建表,或者正在修改现有表,则实现外键所需的 SQL 会有所不同。 This page包含这两种方法的示例。

使用外键创建表的简单情况:

CREATE TABLE Shop (
    id int NOT NULL,
    name text NOT NULL, 
    typeId int NOT NULL,
    locationId int NOT NULL,
    PRIMARY KEY (id),
    CONSTRAINT FK_TypeShop FOREIGN KEY (typeId)
    REFERENCES Types(id),
    CONSTRAINT FK_LocationShop FOREIGN KEY (locationId)
    REFERENCES Location(id)
)  ENGINE=INNODB;

重要说明:在 MySql 中,只有 InnoDB 存储引擎支持外键,因此您必须在 SQL 命令末尾使用 ENGINE=INNODB 参数创建表才能使用外键限制。如果您不指定,则将使用默认引擎而不是 INNODB,并且您的外键将不起作用。 更新:自 5.5.5 版起,InnoDB 成为默认引擎,因此除非已针对您的数据库显式更改引擎,否则不需要显式引擎参数。

This page包含对 MySQL 中外键的很好的解释(对于您现在需要的内容来说可能太详细了,但是您可以查看它以获取具体信息)。

作为最佳实践,请以复数或单数形式命名所有表,但对所有表使用相同的标准。也许您应该将表 Types 重命名为 Type (或者重命名其他两个表以赋予它们复数名称)。

关于mysql - MySQL 数据库中的多种关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49209578/

相关文章:

php - 警告 : mysql_num_rows(): supplied argument is not a valid MySQL result resource

java - JDBC 和并发问题

c# - 当连接丢失时,我将如何重新连接 Entity Frameworks 连接到数据库

mysql - 为文本类型列创建索引

sql - 您可以在 select 命令中创建一个 case 语句来评估两个不同的表字段吗?

java - 重用数据库连接

mysql - 如何在mysql中按指定值列表获取数据顺序并从列表中最后找到剩余的未找到值?

java - 在 JSF 和 JPA 项目中使用 POJO 作为模型,对吗?

php - 你如何 ORDER BY 两个表?

mysql - 我可以将字符串类型与having子句一起使用吗(例如...having sex ='male')