mysql – 自动递增键和外键作为关系数据库的组合

我没有任何数据库的经验,除了我只是在玩工作台并尝试理解我需要如何为项目设置这个数据库.我一直在网上搜索,我越来越困惑,我将如何做我想做的事情.以下是我想要完成的事情.

我需要一个能够保存患者信息的MySQL数据库.患者信息将是名称,ID(唯一)等,以及每个测试的所有测试和样本.

>每位患者都可以进行多项检查
>每个测试可以有多个样本
>如果我删除了患者,则删除所有测试和样本
>如果删除测试,则将删除所有样本
>如果我删除一个测试的所有样本或一个患者的所有测试,则不应删除测试OR患者.

到目前为止,我理解关系数据库是我需要的.我也理解我可以使用外键来链接每个表的患者ID以及每个表的测试ID.我还得出结论,我希望数据完整性,以便我不必手动管理删除和更新行.这也不允许孤立的行.我相信这可以通过复合键完成,但这是我开始对如何设置它感到困惑的地方.

我希望它能像这样工作(每行都是一个插入语句):

病人表:

|-------------------|
|Patient ID  |Name  |
|-------------------|
|12345       |ANG   |
|54321       |JUE   |
|-------------------|

测试表:

|----------------------|
|Test ID  |Patient ID  |
|----------------------|
|1        |12345       |
|2        |12345       |
|3        |12345       |
|1        |54321       |
|2        |54321       |
|4        |12345       |
|----------------------|

样本表:

|----------------------------------|
|Sample ID  |Test ID  |Patient ID  |
|----------------------------------|
|1          |1        |12345       |
|2          |1        |12345       |
|3          |1        |12345       |
|1          |2        |12345       |
|1          |1        |54321       |
|1          |2        |54321       |
|2          |2        |54321       |
|2          |2        |12345       |
|----------------------------------|

这可以轻松完成吗?我也知道这可以通过一个或两个触发器完成,但我理解为不处理删除等.还有另一种方法可以更容易实现吗?此外,从该数据库写入和读取的数据由我的LabVIEW程序处理.

最佳答案
在您的情况下,您不需要复合键来强制执行参照完整性.原因是你有一个非常直接的三层层次结构:

PATIENT 
   +
   |
   ^
 TEST 
   +
   |
   ^
SAMPLE

您的SAMPLE表只需要一个简单的外键到您的TEST表,您的TEST表只需要一个简单的外键到您的PATIENT表.

这是有效的,因为每个样本记录都需要一个测试记录,每个测试都需要患者.如果删除患者,则必须级联删除他们的测试.如果删除测试,则必须级联删除其样本.因此,您不需要在TEST表中使用patient_id.您只需要在外键上声明级联删除,就像这样……

...
CONSTRAINT 'FK_TEST__PATIENT' FOREIGN KEY ('patient_id')
      REFERENCES 'PATIENT' ('patient_id') ON DELETE CASCADE
...
CONSTRAINT 'FK_SAMPLE__TEST' FOREIGN KEY ('test_id')
      REFERENCES 'TEST' ('test_id') ON DELETE CASCADE
...

转载注明原文:mysql – 自动递增键和外键作为关系数据库的组合 - 代码日志