表关系的正确数据库结构(mysql)

y1aodyip  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(250)

我有一张table payouts 带列 reciever_id 必须链接到另外两个表的主键: workers 或者 doctors ,这是由 payouts . reciever_type . 据我所知,这种结构有点错误。
最好是 payouts 这样地?

....
`reciever_worker` INT(10) UNSIGNED DEFAULT NULL,
`reciever_doctor` INT(10) UNSIGNED DEFAULT NULL
....

或合并表 workers 以及 doctors 一张table。
表的结构:

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`)

如何正确、规范地实现?

xwbd5t1u

xwbd5t1u1#

注意:只有“接收者id”始终是医生或工人时,此项才有效。
如果重命名 doctors 将表转换为更通用的表,那么对于工作人员和医生来说,只有一个表是完全合理的,另外还有一个表 type 将它们标记为一个或另一个的列。
然后,从 payouts 表您将使用一列,其中fk指向这一个包含工人和医生的表。也, receiver_type 会是多余的 payouts table。
有两个独立的列的 payouts 如果一个表是空的,则会导致永久性检查( NULL )或者检查类型并使用一个或另一个表,依此类推。简言之,这会让你的生活变得很复杂,没有任何好处。

相关问题