据我所知,外键(FK)用于帮助程序员以正确的方式操作数据.假设程序员实际上已经以正确的方式执行此操作,那么我们真的需要外键的概念吗?
外键还有其他用途吗?我在这里错过了什么吗?
可能重复:
外键有什么问题?
我使用MS Sql Server和一个大约4 GB数据的大型数据库.
我在网上搜索为什么我应该使用外键.到现在为止,我只索引用于连接表的键.性能都很好,dataintegrety没问题.
我应该使用外键吗?使用外键可以获得更高的性能吗?
人们在关系数据库中使用外键指出的缺点之一是在执行任何插入操作之前确保父表存在的开销.(例子).随着数据库和操作的增长,这种影响会被放大.有谁知道网络上的大型网站是否使用它们呢?如果是这样,他们如何克服额外的开销?如果没有,随着您的开发团队变得更大,似乎可能会导致很多潜在的错误/冲突/错误传达/孤立行.
任何见解?
我在Mongodb有用户和照片文件.每张照片属于用户,照片可能在用户之间共享.让我们说user1有p1,p2,p3照片,user2有p3,p4,p5照片.如果我删除user1(手动使用指南针之类的工具),也应该删除p1和p2而不是p3.如何实现这个以及我需要定义什么样的数据库结构?
目前,如果我删除user1,则不会删除任何照片并保留在数据库中,这使得数据库从使用数据库的应用程序的角度来看已损坏.
其Spring Boot应用程序以及用户和照片声明为:
import lombok.Builder;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.DBRef;
import org.springframework.data.mongodb.core.mapping.Document;
@Document
@Data
@Builder
public class User {
@Id
private String id;
@DBRef
private Set<Photo> photos;
private String name;
}
@Document
@Data
@Builder
public class Photo {
@Id
private String id;
private String fileName;
}
Run Code Online (Sandbox Code Playgroud) 我读到某个地方说每个表应该有一个主键来实现1NF.
我有一个tbl_friendship表.
表格中有两个字段:所有者和朋友.
所有者和朋友的字段是tbl_user中自动增量id字段的外键.
这个tbl_friendship应该有一个主键吗?我应该在tbl_friendship中创建一个自动增量id字段并将其作为主键吗?
仅仅通过让数据库强制执行外键,它在开发方面造成了很多麻烦.特别是在单元测试期间,由于外键约束我无法删除表,我需要按照外键约束警告不会被触发的顺序创建表.实际上,我没有看到让数据库强制执行外键约束的重点.如果应用程序设计得当,除了select查询之外,不应该有任何手动数据库操作.我只是想确保通过不在数据库中使用外键约束并将其完全留给应用程序负责来确保我不会陷入困境.我错过了什么吗?
PS我的真实单元测试(不是那些使用模拟)将丢弃现有的表,如果底层域对象的结构已被修改.
我以前主要使用MyISAM表,它不支持外键.看看堆栈溢出,我没有找到一个很好的,简洁的解释外键实际上在做什么.我最感兴趣的是连接表,你会有这样的模式:
customers
id category_id
products
id category_id
categories
id
customerproducts
customer_id product_id
Run Code Online (Sandbox Code Playgroud)
如果我在客户产品上有外键,它将确保只有有效的客户和只有有效的产品进入该表,但是如果我尝试将电话类别的产品添加到仅指定为对复印机感兴趣的客户?这会导致外键约束被违反吗?
我的问题具体是关于sql-server,但可能有任何数据库背景的人都可以回答
如果我希望表A与某个列上的表B具有1:1的关系,我是否应该以某种方式修改CREATE TABLE语句来识别这种关系,或者这是根本没有完成的事情(而是由逻辑处理) )?
编辑
我的问题的第二部分是:将这个嵌入到代码中的重点是什么?为什么不在逻辑上处理选择/更新?
database ×6
foreign-keys ×4
sql ×3
sql-server ×2
mongodb ×1
nosql ×1
oracle ×1
performance ×1
production ×1
rdbms ×1
scalability ×1
spring-boot ×1