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

alt*_*983 4 mysql foreign-key database-design auto-increment

除了使用工作台并试图了解我需要如何为项目设置此数据库之外,我对数据库没有任何经验。我一直在网上搜索,我对如何做我想做的事情越来越困惑。以下是我正在努力完成的工作。

我需要一个用于保存患者信息的 MySQL 数据库。患者信息将是姓名、id(唯一)等,以及每个测试的所有测试和样本。

  • 每个患者可以进行多项测试
  • 每个测试可以有多个样本
  • 如果我删除了一个病人,那么所有的测试和样本都会被删除
  • 如果我删除一个测试,那么所有样本都将被删除
  • 如果我删除了一项测试的所有样本或一名患者的所有测试,则不应删除该测试或患者。

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

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

病人表:

|-------------------|
|Patient ID  |Name  |
|-------------------|
|12345       |ANG   |
|54321       |JUE   |
|-------------------|
Run Code Online (Sandbox Code Playgroud)

测试表:

|----------------------|
|Test ID  |Patient ID  |
|----------------------|
|1        |12345       |
|2        |12345       |
|3        |12345       |
|1        |54321       |
|2        |54321       |
|4        |12345       |
|----------------------|
Run Code Online (Sandbox Code Playgroud)

示例表:

|----------------------------------|
|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       |
|----------------------------------|
Run Code Online (Sandbox Code Playgroud)

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

Joe*_*own 5

在您的案例中,您不需要复合键来强制执行参照完整性。原因是你有一个非常直接的三层层次结构:

PATIENT 
   +
   |
   ^
 TEST 
   +
   |
   ^
SAMPLE
Run Code Online (Sandbox Code Playgroud)

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

这是有效的,因为每个样本记录都需要一个测试记录,而每个测试都需要一个患者。如果您删除一个患者,他们的测试必须被级联删除。如果您删除一个测试,它的样本必须被级联删除。因此你不需要patient_idTEST表中。您只需要在外键上声明级联删除,就像这样......

...
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
...
Run Code Online (Sandbox Code Playgroud)