我有一个带有列reciever_id
的表payouts
,根据想法,它必须链接到另外两个表的主键:workers
或doctors
,由payouts
确定。reciever_type
.据我了解,这种结构有点错误。
把payouts
做成这样?
....
`reciever_worker` INT(10) UNSIGNED DEFAULT NULL,
`reciever_doctor` INT(10) UNSIGNED DEFAULT NULL
....
或者将表合并到一个表中workers
和doctors
。
表格结构:
TABLE `payouts`
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`date_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`reciever_type` VARCHAR(25) NOT NULL,
`reciever_id` INT(10) UNSIGNED NOT NULL,
`sum` DOUBLE NOT NULL,
`description` TEXT NOT NULL,
PRIMARY KEY (`id`)
TABLE `workers`
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(40) NOT NULL
PRIMARY KEY (`id`)
TABLE `doctors`
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(40) NOT NULL,
`doctor_fields_1` TEXT ...,
`doctor_fields_2` ...
PRIMARY KEY (`id`)
如何正确、规范地实现?
注意:仅当"receiver_id"始终是医生或工人时,这才有效。
如果将doctors
表中的这些医生字段重命名为更通用的名称,那么只有 1 个表供工作人员和医生使用,并附加一个type
列将它们标记为一个或另一个是完全有意义的。
然后,从payouts
表中,您将使用带有 FK 的单列,该列指向包含工人和医生的这一个表。此外,receiver_type
表中payouts
将是多余的。
payouts
表中有两个单独的列将引起永久检查一个是否为空(NULL
(,或者检查类型并使用一个或另一个表,等等。简而言之,它几乎会使你的生活复杂化,没有任何好处。