关系太关系了?一个MySQL,PHP数据库工作流程

时间:2012-12-01 13:26:19

标签: 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,amount,etc...) etc..

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

我不在我的数据库中使用关系(因为我不知道它是否会更好!我从来没有深入到mysql中,所以我只是使用php从一个表中运行查询到Fitch信息并使用它来运行另一个查询以获取更多信息/商店等。)

例如: 如果我想查看我给我的一位病人的所有药物,例如他的身份是: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次循环进入处方表以获得他以前的所有处方。

所以我想出了一个小柚木,我编辑了我的数据库,以便 patient_id和visit_id几乎是所有表格中的一列所以我可以跳过第2步和第3步到一步( 搜索处方tbl WHERE patient_id = 100),但是在我的数据库中留下了如此多的重复项,我觉得它有点愚蠢的方式去做!!

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

如果可以,有人可以解释一下这将如何缓解我的生活?

我可以重新设计这个但是改变当前表格还是我必须重新创建所有表格?

非常感谢

1 个答案:

答案 0 :(得分:1)

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

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

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

您已经决定通过在几乎所有表格中同时包含patient_id和visit_id来对数据库进行非规范化。非规范化是向各种表添加正式冗余的数据。这通常是出于性能原因而完成的。当您的系统扩展时,这可能是也可能不是明智的决定。但我认为你可以相信你对你所选择的非规范化需求的本能。阅读“数据库规范化”以获得一些背景知识。

一点建议:不要使用名为“id”的列。在每个表中将列命名为相同的列。例如,使用patients.patient_id,visits.patient_id等。这是因为有一堆自动化软件工程工具可以帮助您理解数据库中的关系。如果您的ID列一致命名,则这些工具可以更好地工作。

所以,这是一个关于如何使用单个JOIN查询在您的问题中执行编号为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查询一样,它返回行和列的虚拟表。在这种情况下,虚拟表的每一行都有患者,访问和药物数据。我在这个例子中使用了LEFT JOIN。这意味着没有访问的患者将有一行包含NULL数据。如果指定JOIN MySQL将从虚拟表中省略这些患者。