太亲密无间还是不亲密无间?一个MySQL、PHP数据库工作流

太亲密无间还是不亲密无间?一个MySQL、PHP数据库工作流,php,mysql,database-design,workflow,relational-database,Php,Mysql,Database Design,Workflow,Relational Database,我是mysql的新手,我正在尝试创建一个复杂的数据库,需要一些帮助 我的数据库结构 Tables(columns) 1.patients (Id,name,dob,etc....) 2.visits (Id,doctor,clinic,Patient_id,etc....) 3.prescription (Id,visit_id,drug_name,dose,tdi,etc....) 4.payments (id,doctor_id,clinic_id,patient_id,amou

我是mysql的新手,我正在尝试创建一个复杂的数据库,需要一些帮助

我的数据库结构

 Tables(columns)

 1.patients (Id,name,dob,etc....)
 2.visits (Id,doctor,clinic,Patient_id,etc....)
 3.prescription (Id,visit_id,drug_name,dose,tdi,etc....)
 4.payments (id,doctor_id,clinic_id,patient_id,amount,etc...) etc..

我有大约9个表,所有这些表的主键是'id',并设置为autoinc

我不在数据库中使用关系(因为我不知道它是否更好!而且我从来没有真正深入到mysql,所以我只使用php从一个表中运行查询到惠誉信息,并使用它运行另一个查询以获取更多信息/存储等)

例如: 如果我想查看我给我的一个病人的所有药物,例如他的id是:100

1-click patient name (name link generated from (tbl:patients,column:id))
2-search tbl visits WHERE patient_id=='100' ; ---> that return all his visits ($x array)
3-loop prescription tbl searching for drugs with matching visit_id with $x (loop array).
4- return all rows found.
随着我的数据库越来越大(就诊表中有1k+记录),因此1名患者可以进行40次以上的就诊,即40次循环到处方表中,以获取他以前的所有处方

所以我想出了一个小柚木,在那里我编辑了我的数据库,这样患者id和就诊id几乎在所有表格中都是一列,所以我可以跳过第2步和第3步进入一个步骤( 搜索处方tbl,其中patient_id=100),但这让我的数据库中有太多的副本,我觉得这样做有点愚蠢

我应该开始考虑使用关系数据库吗?

如果是这样,有人能解释一下这将如何缓解我的生活吗

我可以重新设计但更改当前表,还是必须重新创建所有表


非常感谢

是的,您应该利用MySQL的关系数据库功能。随着项目规模的扩大,它们将使您的生活更加轻松

实际上你已经很好地使用了它们。例如,您发现患者可以零次或多次就诊。您现在需要做的是学习使用
JOIN
查询MySQL

一旦知道如何使用JOIN,您可能需要声明一些外键和其他数据库约束。但是没有它们,你的系统可以正常工作

您已经决定通过在几乎所有表中同时包含patient_id和visit_id来取消数据库的规范化。非规范化是将形式上冗余的数据添加到各种表中。这通常是出于性能原因。随着系统的扩展,这可能是一个明智的决定,也可能不是。但是我认为你可以相信你的直觉,你已经选择了非规范化。阅读“数据库规范化”以了解一些背景知识

有一点建议:不要使用名为“id”的列。为每个表中的列命名相同。例如,使用patients.patient\u id、visions.patient\u id等等。这是因为有很多自动化软件工程工具可以帮助您理解数据库中的关系。如果ID列的命名一致,那么这些工具会工作得更好

下面是一个关于如何使用单个连接查询执行问题中编号为2和3的步骤的示例

           SELECT p.patient_id p.name, v.visit_id, rx.drug_name, rx.drug_dose
            FROM patients     AS p
       LEFT JOIN visits       AS v    ON p.patient_id = v.patient_id
       LEFT JOIN prescription AS rx   ON v.visit_id = rx.visit_id
           WHERE p.patient_id = '100'
        ORDER BY p.patient_id, v.visit_id, rx.prescription_id

与所有SQL查询一样,这将返回一个包含行和列的虚拟表。在这种情况下,虚拟表的每一行都有患者、就诊和药物数据。在本例中,我使用了
左连接。这意味着没有就诊的患者将有一行包含空数据。如果您指定
JOIN
MySQL将从虚拟表中忽略这些患者。

MySQL已经是一个关系数据库。在这里看一看:它应该会有帮助,有一个非常优秀的开源项目,你可以看看。