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