时间线的数据库表示

sup*_*r.t 2 mysql sql database

假设我有一个显示两种事件的时间线:

  1. 一位患者到诊所就诊。此类事件涉及患者和诊所。
  2. 一位患者上传了一张照片。这样的事件引用了患者和照片。

所以我这里有几个基础表:patients, clinics, photos.
我也有一些时间表:timeline_visit, timeline_photo.

问题是我是否被迫为每个时间线事件类型使用单独的表,然后使用它UNION来构建一个完整的时间线,或者还有一些我不知道的其他技术(将所有可能的事件存储在一个表中)?如您所见
,表timeline_visittimeline_photo具有共同和不同的字段和键。

Tim*_*sen 5

我会创建一个名为的表events,其中包含四列:

事件

patient_id int
id int
event_date timestamp
event_type int
Run Code Online (Sandbox Code Playgroud)

每个条目将代表一个时间点的一个患者事件。它可以是诊所访问或上传照片。将有两个表用于访问和照片:

访问

id int
event_id int
doctor_id int
decimal (10, 2) cost
double length_of_visit
Run Code Online (Sandbox Code Playgroud)

上传

id int
event_id int
image_id int
image_content blob
Run Code Online (Sandbox Code Playgroud)

现在,当您想要生成事件时间线时,您可以通过查询单个表来完成它:

SELECT *
FROM events
WHERE event_date BETWEEN NOW() AND DATE_SUB(NOW(), INTERVAL 3 HOUR)
Run Code Online (Sandbox Code Playgroud)

上述查询将为您提供过去 3 小时的时间表。如果您想了解查询中每个事件的详细信息,那么您可能必须进行巧妙的UNION查询,因为每个事件的列都不相同。