【问题标题】:Where the foreign keys should be between a "store" table and a "opening hours" table?外键应该在“商店”表和“营业时间”表之间?
【发布时间】:2020-06-12 00:22:00
【问题描述】:

我是一个新手,试图设计一个有商店并且每个商店都有营业时间(1 对 1 关系)的数据库,然后我将有一个名为“create_Store”的过程,在这个过程中我必须创建一个商店行和“opening_times”行。

问题是我不知道哪种方式更好,是否有其他更好的设计方式。

第一种方式:

表:存储
id_store int 主键自增,
fk_id_opening_hours int 外键 (Opening_hours) 不为空

表:Opening_hours
id_opening_hours primary_key 自动递增,
...
...

我对这种方式的想法是,一家商店只有一个“营业时间”行,因此商店引用了“营业时间”,但如果我想这样做,我必须插入第一行一个 Opening_hour 行(因为 Store 的外键不接受空值)并且因为它具有自动增量,那么我将不得不以某种方式找到“Opening_Time”id 来创建商店行。

第二种方式:

表:存储
id_store int 主键自增,
...
...

表:Opening_hours
id_opening_hours primary_key 自动递增,
fk_Store int 外键(存储)不为空

通过这种方式,我可以先创建商店(我觉得这样更自然),然后在同一过程中创建“Opening_hours”行,但现在我必须以某种方式搜索商店 ID(因为它是自动递增的) 创建 opening_hours 行。

我不知道第一种方法是否更有效或更好,因为我已经在表中存储了“开放时间”ID。

【问题讨论】:

  • 向我们展示SELECT,我们可以向您展示JOIN 所需的索引。由此,您可以推断出所需的 FK。

标签: mysql database database-design foreign-keys


【解决方案1】:

理论表明,要强制建立 1:1 关系,您需要每个表都有一个指向另一个表的外键,也就是 UNIQUE。这就引出了一个问题……那么我该如何插入行呢?哪一个先走,因为每个都依赖于另一个?

解决方案采用“可延迟约束”概念,这是 SQL 不可或缺的一部分。不幸的是,MySQL 没有实现 SQL 标准 的这一部分。据我所知,只有 PostgreSQL 和 Oracle 可以。

由于这个限制,MySQL 中可行的解决方案只能使用单个外键。我会先在主表中插入一行(在本例中为 store),获取自动生成的 PK,然后在辅助表中(opening_hours)。第二个将具有指向第一个的前向键。

不过,这是个人喜好问题,因此您完全可以反过来做。

【讨论】:

  • 要获得自动生成的PK,我必须使用类似“SCOPE_IDENTITY()”(sql server)的函数,它在MySql中的等价物是“LAST_INSERT_ID()”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 2011-11-09
  • 2010-10-20
  • 1970-01-01
  • 2012-01-21
  • 2018-01-21
  • 1970-01-01
相关资源
最近更新 更多