假设示例:

我有汽车和车主。每辆汽车在给定时间属于一位(且仅一位)车主,但所有权可以转让。车主可以随时拥有零辆或多辆汽车。我想要的是将历史关系存储在 MySQL 数据库中,以便在任意时间,我可以查找汽车给车主的当前分配。

IE。在时间 X(其中 X 可以是现在或过去的任何时间):

  • 谁拥有汽车 Y?
  • 车主 Z 拥有哪些汽车(如果有)?

  • 在 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/

    10-11 01:37
    查看更多