0

我对 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 次循环进入处方表以获取他以前的所有处方。

所以我想出了一个小柚木,我在其中编辑了我的数据库,这样patient_id 和 visit_id 几乎是所有表中的一列,所以我可以跳过第 2 步和第 3 步进入一个步骤(搜索处方 tbl WHERE patient_id=100),但这给我留下了我的数据库中有这么多重复项,我觉得这样做有点愚蠢!

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

如果是这样,有人可以解释一下这将如何使我的生活更轻松吗?

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

非常感谢你

4

1 回答 1

1

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

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

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

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

One little bit of advice: Don't use columns named simply "id". Name columns the same in every table. For example, use patients.patient_id, visits.patient_id, and so forth. This is because there are a bunch of automated software engineering tools that help you understand the relationships in your database. If your ID columns are named consistently these tools work better.

So, here's an example about how to do the steps numbered 2 and 3 in your question with a single JOIN query.

           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

Like all SQL queries, this returns a virtual table of rows and columns. In this case each row of your virtual table has patient, visit, and drug data. I used LEFT JOIN in this example. That means that a patient with no visits will have a row with NULL data in it. If you specify JOIN MySQL will omit those patients from the virtual table.

于 2012-12-01T15:49:06.993 回答