gpt4 book ai didi

sql - 为什么外键在理论上比在实践中更多地使用?

转载 作者:太空狗 更新时间:2023-10-30 01:37:55 26 4
gpt4 key购买 nike

当你学习关系理论时,外键当然是强制性的。但实际上,在我工作的每个地方,表产品和连接总是通过在查询中明确指定键来完成,而不是依赖 DBMS 中的外键。

这样,您当然可以通过不是外键的字段连接两个表,从而产生意想不到的结果。

你认为这是为什么? DBMS 不应该强制仅通过外键创建连接和产品吗?

编辑:感谢您的所有回答。现在我很清楚 FK 的主要原因是引用完整性。但是如果你设计一个数据库,模型中的所有关系(即 ERD 中的箭头)都会变成外键,至少在理论上,无论你是否在你的 DBMS 中这样定义它们,它们在语义上都是外键。我无法想象需要按不是 FK 的字段连接表。 谁能举个有意义的例子?

PS:我知道 N:M 关系成为单独的表而不是外键这一事实,只是为了简单起见而将其省略。

最佳答案

存在外键约束的原因是保证引用的行存在。

“外键标识一个表中的一列或一组列引用另一个表中的一列或一组列。引用列的一行中的值必须出现在被引用表的单个行中.

因此,引用表中的行不能包含引用表中不存在的值(除非可能为 NULL)。通过这种方式,可以通过引用将信息链接在一起,这是数据库规范化的重要组成部分。”( Wikipedia )


回复:您的问题:“我无法想象需要按非 FK 的字段连接表”:

定义外键约束时,引用表中的列必须是引用表的主键,或者至少是候选键。

在进行连接时,不需要使用主键或候选键进行连接。

下面是一个可能有意义的例子:

CREATE TABLE clients (
client_id uniqueidentifier NOT NULL,
client_name nvarchar(250) NOT NULL,
client_country char(2) NOT NULL
);

CREATE TABLE suppliers (
supplier_id uniqueidentifier NOT NULL,
supplier_name nvarchar(250) NOT NULL,
supplier_country char(2) NOT NULL
);

然后查询如下:

SELECT 
client_name, supplier_name, client_country
FROM
clients
INNER JOIN
suppliers ON (clients.client_country = suppliers.supplier_country)
ORDER BY
client_country;

这些连接有意义的另一种情况是在提供地理空间功能的数据库中,例如 SQL Server 2008 或带有 PostGIS 的 Postgres。您将能够执行如下查询:

SELECT
state, electorate
FROM
electorates
INNER JOIN
postcodes on (postcodes.Location.STIntersects(electorates.Location) = 1);

来源:ConceptDev - SQL Server 2008 Geography: STIntersects, STArea

您可以在帖子“Sql 2008 query problem - which LatLong’s exists in a geography polygon?”的已接受答案中看到另一个类似的地理空间示例:

SELECT 
G.Name, COUNT(CL.Id)
FROM
GeoShapes G
INNER JOIN
CrimeLocations CL ON G.ShapeFile.STIntersects(CL.LatLong) = 1
GROUP BY
G.Name;

这些都是有效的 SQL 连接,与外键和候选键无关,在实践中仍然有用。

关于sql - 为什么外键在理论上比在实践中更多地使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1876013/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com