【问题标题】:What is the best workaround to store a predefined list items of items inside a single column in mySQL? [duplicate]将预定义的项目列表项存储在 mySQL 的单个列中的最佳解决方法是什么? [复制]
【发布时间】:2021-04-23 23:58:14
【问题描述】:

我正在做一个项目,将患者的医疗记录存储在医院预约系统中,但我被困在过敏列上。每个患者可能有或可能没有一种或多种过敏症。这方面的数据类型是“预定义的”,因此肯定有很多类型的过敏,但数量最终是有限的。

我很清楚没有办法将一系列项目存储在单个列中:关系数据库本质上每个行/列组合存储一个值,但我已经看到了一些解决方法,我会想问什么是最好的方法。

我不能使用 Set 数据类型,因为肯定有超过 64 种过敏。

我可以使用以下列完全针对过敏创建另一个表: allergy(patient_id,seq_no,allergies),其中主键是前两列的组合。

虽然这种方法可以让我查询特定患者 select allergies from allergy where id = patient_id; 我不知道如何将每个新患者的 seq_no 的自动增量值重置为 0。

我可以将这种类型的数据存储在 JSON 数据类型中,但在我看来这是一个非常奇怪的解决方案,我从未见过有人使用这种数据类型,我认为这种数据类型很少见。

最终我可以只将数据类型存储在标准 Varchar 字段中,但这需要在后端进行额外的工作以检索个人过敏症,不允许我查询,坦率地说是不太优雅的解决方案。

【问题讨论】:

标签: mysql database-design


【解决方案1】:

对于这种类型的设计,您将查看三个表格:

  • 过敏
  • 病人
  • 患者过敏

从根本上说,过敏信息将具有不同的结构,即使是一个简单的结构,但它在概念上携带的信息与患者不同。

allergy 可能包含:

  • 过敏 (auto_inc)
  • 过敏名称(varchar)

patient 可能包含:

  • patient_id (auto_inc)
  • 患者名字(varchar)
  • 患者姓氏(varchar)

patientallergy 将只是相关的过敏患者信息列表:

  • patient_id (int)
  • allergy_id (int)

这很可能作为外键关系有意义。例如,以下将获取 id 为 1 的患者的任何过敏症的名称:

Select allergy_name 
FROM `patientallergy` 
WHERE patient_id = 1 
LEFT JOIN allergy

您这样设计的原因是,正如您正确指出的那样,患者可能有 0 个或多个过敏症的一对任意关系。由于信息不是每个患者都会拥有的,因此您不希望将其存储在患者表上(所有患者都会有姓名或出生日期等信息)。因为存储过敏信息对于一些患者来说会出现很多空行,而对于其他患者来说空间会很快用完。

本质上:您的问题触及了关系数据库的核心设计目的。它们的力量来自能够创造一个地方来存储一些东西(patientsallergies)然后关联(patientsallergies),因为这种关系在结构上传达了与它相关的东西不同的信息。

【讨论】:

    猜你喜欢
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    相关资源
    最近更新 更多