假设示例:
我有汽车和车主。每辆汽车在给定时间属于一位(且仅一位)车主,但所有权可以转让。车主可以随时拥有零辆或多辆汽车。我想要的是将历史关系存储在 MySQL 数据库中,以便在任意时间,我可以查找汽车给车主的当前分配。
IE。在时间 X(其中 X 可以是现在或过去的任何时间):
在 SQL 中创建一个 M:N 表(带有时间戳)很简单,但我想避免相关的子查询,因为该表会变大(因此性能会受到影响)。有任何想法吗?我有一种感觉,有一种方法可以通过将这样的表与自身连接来做到这一点,但我对数据库的经验并不丰富。
更新:我想避免每行同时使用“start_date”和“end_date”字段,因为每次插入新行时都需要(可能)昂贵的查找。 (此外,它是多余的)。
最佳答案
制作第三个名为 CarOwners 的表,其中包含 carid、ownerid 和 start_date 和 end_date 的字段。
购买汽车时,请填写前三个并检查表格以确保没有其他人被列为车主。如果有,则使用该数据作为 end_date 更新记录。
要查找当前所有者:
select carid, ownerid from CarOwner where end_date is null
要在某个时间点找到所有者:
select carid, ownerid from CarOwner where start_date < getdate()
and end_date > getdate()
getdate() 是特定于 MS SQL Server 的,但每个数据库都有一些返回当前日期的函数 - 只是替换。
当然,如果您还想从其他表中获得更多信息,您也可以加入它们。
select co.carid, co.ownerid, o.owner_name, c.make, c.Model, c.year
from CarOwner co
JOIN Car c on co.carid = c.carid
JOIN Owner o on o.ownerid = co.ownerid
where co.end_date is null
关于sql - 存储(和访问)历史 1 :M relationships in a relational database? 的最佳方式是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/745242/