使用相关表的正确方法和可能的解决方法?

时间:2019-04-17 20:57:00

标签: mysql relational-database

我问的这个问题是要教会我自己在某种情况下使用正确的方法,而不是如何编码的问题。

由于我是自学成才的学生,以前从未使用过关系表。通过搜索和实验,我已经知道关系的基本概念及其用法,但是我不确定在使用这些表时是否仍在使用正确的方法。

我没有任何官方老师,所以在这里我只能问你们一个令人困扰的问题。

例如,我写了一些代码,其中有2个表。

  1. 表1是doctors,其中具有id (AI和主数据库)names的varChar表。
  2. 表2是patient_recipts,其中有一个doctor_name表tinyint
  3. names表中包含医生的姓名
  4. doctor_name表保存着id表中相应的doctors
  5. namedoctor_name在数据库中彼此关联

现在,当我需要从patient_recipts获取数据并显示医生的姓名时,我将需要INNER JOIN doctor表,将doctor_name的值与医生中的id进行比较表格并获得医生的名字。

我将用来获取某位医生的患者的查询类似

$getPatList = $db->prepare("SELECT *
        FROM patient_recipts
        INNER JOIN doctor ON patient_recipts.doctor_name = doctor.id
        WHERE dept = 'OPD' AND date_time = DATE(NOW())
        ORDER BY patient_recipts.id DESC");

现在,如果我要在其他处理器文件中插入动作日志条目,它将类似于(动作和日志条目)

    $recipt_no = $_POST['recipt_no'];
    $doctor_name = $_POST['doctor_name']; //this hold id(int) not text
    $dept = $_POST['dept'];
    $patient_name = $_POST['patient_name'];
    $patient_tel = $_POST['patient_telephone'];
    $patient_addr = $_POST['patient_address'];
    $patient_age = $_POST['patient_age'];
    $patient_gender = $_POST['patient_gender'];
    $patient_fee = $_POST['patient_fee'];
    $logged_user = $_SESSION['user_name'];

    $insData = $db->prepare("
          INSERT INTO patient_recipts (date_time, recipt_no, doctor_name, dept, pat_gender, pat_name, pat_tel, pat_address, pat_age, pat_fee, booked_by) 
          VALUES (NOW(),?,?,?,?,?,?,?,?,?,?)");
    $insData->bindValue(1,$recipt_no);
    $insData->bindValue(2,$doctor_name);
    $insData->bindValue(3,$dept);
    $insData->bindValue(4,$patient_gender);
    $insData->bindValue(5,$patient_name);
    $insData->bindValue(6,$patient_tel);
    $insData->bindValue(7,$patient_addr);
    $insData->bindValue(8,$patient_age);
    $insData->bindValue(9,$patient_fee);
    $insData->bindValue(10,$logged_user);

    $insData->execute();

    // Add Log
    write_log("{$logged_user} booked OPD of patient {$patient_name} for {$doctor_name}");

OUTPUT: Ayesha booked OPD of patient Steve for 15

现在问题很明显了,我将需要再次执行上述提取查询再次以获取具有ID比较的医生的姓名并将ID 15绑定到Doctor的姓名之前调用write_log()函数。

所以这是我认为我的方法完全错误的地方。

  1. 一种方法是在patient_recipts中使用实际的医生姓名而不是ID
  2. 但是,这首先会扼杀学习相关表和键,学习设计方案和故障排除的目的。

请提供帮助,以便在以后的日子里我能理解并实施更好的方法:)

1 个答案:

答案 0 :(得分:0)

您的表结构是正确的,将ID用作其他表中的外键被认为是最佳实践。如果要在日志消息中包括医生的姓名,则必须执行另一个SELECT查询。像

这样的查询
SELECT name
FROM doctor
WHERE id = :doctor_id

不是很贵。

但是您可以简单地使用仅包含ID的日志文件。如果需要查找特定日志消息所指的是哪位医生,请稍后再查询该医生的名字。

顺便说一句,当您使用PDO时,建议您使用命名的占位符(如上面的示例所示),而不要使用?。它使代码更易于阅读,并且如果您修改查询以添加或删除列,则不必更改所有占位符编号。