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 程序处理。
在您的案例中,您不需要复合键来强制执行参照完整性。原因是你有一个非常直接的三层层次结构:
PATIENT
+
|
^
TEST
+
|
^
SAMPLE
Run Code Online (Sandbox Code Playgroud)
您的SAMPLE
表只需要一个简单的TEST
表外键,而您的TEST
表只需要一个简单的PATIENT
表外键。
这是有效的,因为每个样本记录都需要一个测试记录,而每个测试都需要一个患者。如果您删除一个患者,他们的测试必须被级联删除。如果您删除一个测试,它的样本必须被级联删除。因此你不需要patient_id
在TEST
表中。您只需要在外键上声明级联删除,就像这样......
...
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)
归档时间: |
|
查看次数: |
7819 次 |
最近记录: |