我有两个简单的表"Items"和"Orders".为简单起见,我们假设一个项目只能有一个订单,或者一个订单只能包含一个项目.

现在,由于这可以使用简单的一对一关系实现,因此我可以执行以下操作:

我可以将Orders表的主键添加到Items表,如下所示

//Table Items
item_id, item_name, order_id
1,        shoes,    1
2,        watch,    2

//Table Orders
order_id, customer
1,        James
2,        Rick

或者,我可以将Items表的主键添加到Orders表,如下所示

//Table Items
    item_id, item_name
    1,        shoes
    2,        watch

//Table Orders
order_id, customer, item_id
1,        James,    1   
2,        Rick,     2

哪一个是正确的,为什么?有没有什么准则来决定哪把 keys 放在哪里?当然,常识在上面简单的例子中是有用的,但在复杂的例子中,我们如何决定?

推荐答案

One-to-One个关系通常应该简单地合并到一个表中.如果没有任何矛盾,One-to-One人的关系可能是一个未经考虑的决定的标志.

如果你真的想要使用这种关系,完全取决于你把FK放在哪里.在应用FK时,可能需要考虑可选性.然而,在MySQL中,它仍然不是真正的一对一关系,因为那里不支持延迟键.

Database相关问答推荐

触发器作为完整性的判断约束

Rust 全局存储数据库连接

如何使用 Gramex FormHandler 动态(在运行时)创建或更改数据库模式

如何理解mysql explain 命令

发布 Oracle 和 SQL Server 性能测试是否违反许可?

如何以编程方式在 C# 中创建 Microsoft Access 数据库?

MySQL 语法 LIMIT x, y 的 T-SQL 类似的功能是什么?

如何在 sql server 2005 中获取到数据库的详细连接列表?

即使使用列入白名单的 IP,也无法连接到 Azure SQL 数据库

如何在构建时创建填充的 MySQL Docker 映像

我可以为 dapper-dot-net 映射指定数据库列名称吗?

什么是本体数据库?

SOA 和共享数据库

为什么 HikariCP 推荐固定大小的池以获得更好的性能

如何用 SQL 思考?

什么是非关系数据库的例子?

Python中准备好的语句和参数化查询之间的混淆

Codeigniter - 使用多个数据库

是否有任何支持协议缓冲区的数据库?

在 UI 中执行业务逻辑的单元测试数据库应用程序