我对数据库比较陌生,所以如果有明显的方法可以解决这个问题,或者如果我遗漏了一些基本过程,我深表歉意。我在涉及患者医疗记录的 Web 应用程序中使用 PHP 和 MySQL。一项要求是用户能够从网页查看和编辑医疗记录。
正如我所设想的那样,单个 Patient
对象具有基本属性,例如 id
、name
和 address
,然后每个Patient
还有一个Medication
对象数组(med_name, dose, reason
),Condition
对象(cond_name、date、notes
)和其他此类对象(过敏、家族史等)。 我的第一个想法是使用如下表的数据库模式:
- 患者(身份证、姓名、地址……)
- 药物(patient_id、med_name、剂量、原因)
- 条件(patient_id, cond_name, date, notes)
- ...
然而,这对我来说似乎是错误的。添加新的药物或病症很容易,但删除或编辑现有的药物或病症似乎效率低得离谱 - 我不得不,比如说,搜索 medications
表以查找匹配 patient_id< 的行
使用旧的 med_name
、dose
和 reason
字段,然后用新数据删除/编辑它。我可以向 medications
和 conditions
表添加一些主键,以便更有效地找到要编辑的行,但这看起来像是任意数据。
如果我只有一个具有以下架构的表呢?
- 患者(身份证、姓名、地址、药物、条件……)
meds
和 conds
只是 Medication
和 Condition
对象数组的简单表示(例如,二进制) ? PHP 可以解释这些数据并根据需要在数据库中获取和更新它。
欢迎就此处的最佳做法提出任何想法。我也在考虑切换到 Ruby on Rails,所以如果这影响了我应该做出的任何决定,我也很想听听。非常感谢大家。
最佳答案
像这样对数据进行编码的“坏处”或“好处”取决于您的需要。如果您从不需要引用那些“meds”和“conds”表中的单个较小数据 block ,那么就没有问题。
但是,您实际上是在将您的数据库缩减为一个稍微聪明一点的存储系统,并且失去了 SQL 数据库“关系”部分的优势。
例如如果你需要运行一个查询“找到所有服用伟哥并有心脏病的患者”,那么 DBMS 将无法直接运行该查询,因为它不知道你是如何“隐藏”伟哥的/这两个字段中的心脏状况数据,而使用正确规范化的数据库,您将拥有:
SELECT ...
FROM patients
LEFT JOIN conditions ON patients.id = conditions.patient_id
LEFT JOIN meds ON patients.id = meds.patient_id
WHERE (meds.name = 'Viagra') AND (condition.name = 'Heart Disease')
DBMS 自动处理一切。如果您将所有内容编码到一个字段中,那么您将陷入子字符串操作(假设数据采用某种可读的 ascii 格式),或者更糟的是,必须将整个数据库吸入您的客户端应用程序,解码每个字段,检查它的内容,然后扔掉所有不含伟哥或心脏病的东西——非常低效。
关于php - 将面向对象的数据直接编码为关系数据库中的单行是否被认为是错误的形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8851732/