使用相关表的正确方法和可能的解决方法?
Correct approach for using related tables and possible workarounds?
我问这个问题是为了教自己在特定情况下使用正确的方法,而不是任何如何编写代码的问题。
因为我是自学的学生,之前没有使用过关系 table。通过搜索和实验,我已经了解了关系的基本概念及其用法,但我不确定在使用这些 table 时我是否仍在使用正确的方法。
我没有正式的老师所以我只能在这里和你们一起问麻烦的问题。
例如,我写了一些代码,其中有 2 tables。
- Table-1 是
doctors
,它有一个 id
(AI 和主要) 和 names
table 的 varChar.
- Table-2 是
patient_recipts
它有一个 doctor_name
table 的 tinyInt
names
table抱医生的名字
doctor_name
table 持有 doctors
table 对应的 id
name
和 doctor_name
在数据库中相互关联
现在,当我需要从 patient_recipts
获取数据并显示医生姓名时,我将需要 INNER JOIN doctor
table,将 doctor_name
值与 id
in doctor table 并获取医生的姓名。
我将用来获取某位医生的患者的查询类似于
$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
在调用 write_log()
函数之前更改为 Doctor 的名字。
所以这就是我认为我的方法完全错误的地方。
- 一种方法是在
patient_recipts
中使用真实的医生姓名而不是 ID
- 但这首先会扼杀学习相关 table 和密钥、学习设计方案和故障排除的目的。
请帮助我理解并在未来几天实施更好的方法:)
您的 table 结构是正确的,在其他 table 中使用 ID 作为外键被认为是最佳实践。如果您想在日志消息中包含医生的姓名,则必须执行另一个 SELECT
查询。像
这样的查询
SELECT name
FROM doctor
WHERE id = :doctor_id
不是很贵。
但是您可以简单地接受仅包含 ID 的日志文件。如果您需要找出特定日志消息所指的医生,请稍后查找医生的姓名。
顺便说一句,当你使用 PDO 时,我建议你使用命名占位符(如我上面的示例)而不是 ?
。它使代码更易于阅读,如果您修改查询以添加或删除列,则不必更改所有占位符数字。
我问这个问题是为了教自己在特定情况下使用正确的方法,而不是任何如何编写代码的问题。
因为我是自学的学生,之前没有使用过关系 table。通过搜索和实验,我已经了解了关系的基本概念及其用法,但我不确定在使用这些 table 时我是否仍在使用正确的方法。
我没有正式的老师所以我只能在这里和你们一起问麻烦的问题。
例如,我写了一些代码,其中有 2 tables。
- Table-1 是
doctors
,它有一个id
(AI 和主要) 和names
table 的 varChar. - Table-2 是
patient_recipts
它有一个doctor_name
table 的 tinyInt names
table抱医生的名字doctor_name
table 持有doctors
table 对应的 name
和doctor_name
在数据库中相互关联
id
现在,当我需要从 patient_recipts
获取数据并显示医生姓名时,我将需要 INNER JOIN doctor
table,将 doctor_name
值与 id
in doctor table 并获取医生的姓名。
我将用来获取某位医生的患者的查询类似于
$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
在调用 write_log()
函数之前更改为 Doctor 的名字。
所以这就是我认为我的方法完全错误的地方。
- 一种方法是在
patient_recipts
中使用真实的医生姓名而不是 ID - 但这首先会扼杀学习相关 table 和密钥、学习设计方案和故障排除的目的。
请帮助我理解并在未来几天实施更好的方法:)
您的 table 结构是正确的,在其他 table 中使用 ID 作为外键被认为是最佳实践。如果您想在日志消息中包含医生的姓名,则必须执行另一个 SELECT
查询。像
SELECT name
FROM doctor
WHERE id = :doctor_id
不是很贵。
但是您可以简单地接受仅包含 ID 的日志文件。如果您需要找出特定日志消息所指的医生,请稍后查找医生的姓名。
顺便说一句,当你使用 PDO 时,我建议你使用命名占位符(如我上面的示例)而不是 ?
。它使代码更易于阅读,如果您修改查询以添加或删除列,则不必更改所有占位符数字。