我正在使用PHP MySQL创建一个办公信函分发系统,其中office Division是唯一的id分派项,可以由division_id分割。
通过添加列字母类型,我可以将Inward和Outward发送信函组合在一个表中。
我决定做两张桌子,一张是Inward的,一张是Outward的
CREATE TABLE `dispatchs_inward` (
`dispatch_id` bigint(20) UNSIGNED NOT NULL,
`subject` varchar(200) CHARACTER SET latin1 DEFAULT NULL,
`dispatch_message` varchar(10000) CHARACTER SET latin1 NOT NULL DEFAULT '',
`file_attached` varchar(100) CHARACTER SET latin1 DEFAULT NULL,
`dispatch_date` varchar(40) CHARACTER SET latin1 DEFAULT NULL,
`dispatch_status` int(10) UNSIGNED NOT NULL DEFAULT '0',
`sender_division_id` int(10) DEFAULT NULL,
`reciever_division_id` int(10) DEFAULT NULL,
`reciever_status` int(10) UNSIGNED NOT NULL DEFAULT '0',
`sent_status` int(10) UNSIGNED NOT NULL DEFAULT '0',
`read_status` int(10) UNSIGNED NOT NULL DEFAULT '0',
`reject_status` int(10) UNSIGNED NOT NULL DEFAULT '0',
`reject_note` varchar(100) CHARACTER SET latin1 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `dispatchs_outward` (
`dispatch_id` bigint(20) UNSIGNED NOT NULL,
`subject` varchar(200) CHARACTER SET latin1 DEFAULT NULL,
`dispatch_message` varchar(10000) CHARACTER SET latin1 NOT NULL DEFAULT '',
`file_attached` varchar(100) CHARACTER SET latin1 DEFAULT NULL,
`dispatch_date` varchar(40) CHARACTER SET latin1 DEFAULT NULL,
`dispatch_status` int(10) UNSIGNED NOT NULL DEFAULT '0',
`sender_division_id` int(10) DEFAULT NULL,
`reciever_division_id` int(10) DEFAULT NULL,
`reciever_status` int(10) UNSIGNED NOT NULL DEFAULT '0',
`sent_status` int(10) UNSIGNED NOT NULL DEFAULT '0',
`read_status` int(10) UNSIGNED NOT NULL DEFAULT '0',
`reject_status` int(10) UNSIGNED NOT NULL DEFAULT '0',
`reject_note` varchar(100) CHARACTER SET latin1 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;请帮我把它做得更好,桌子之间的关系是什么?专家建议受到高度赞赏。
发布于 2020-08-19 19:06:33
我将创建一个带有分派类型列的调度表。这两个表是相同的,这表明它们是同一个实体。同时,内向和向外是模糊的,因为内/向外相对于什么?像这样模糊的术语说明了数据模型的问题。有两个调度表会使引用特定的分派变得更加困难。
这两张桌子之间有关系吗?在这种情况下,内向vs向外没有帮助--在这种关系中,哪个表是主表。考虑下面的示例,说明如何使用一个调度表和另一个表显示关系。
CREATE TABLE dispatch (
`dispatch_id` bigint(20) UNSIGNED NOT NULL,
... snip ...
);
CREATE TABLE response_to (
`parent_dispatch_id` bigint(20) UNSIGNED NOT NULL,
`response_dispatch_id` bigint(20) UNSIGNED NOT NULL
);还有一些其他设计要点需要考虑:
应该避免将日期存储为字符串,因为在格式中执行一致性变得更加困难,算术操作变得更昂贵,而且日期间隔更昂贵。
较早的数据库设计通常出于性能原因使用数字作为标记(字符串比较比整数比较昂贵),但对于大多数实现来说,这通常不是一个问题。在我的经验中,数字标记的使用使新用户难以使用,并削弱了与底层模型的关系。例如,假设sent_status=47与sent_status='QUEUED',哪个更容易理解?
在数据库规范化中有一种很好的艺术,你的桌子也很好。看起来,您已经将两个不同的实体合并到一个表中。我建议您考虑是否有不同的模型可能更适合您的应用程序。例如,您可能希望拆分内容(如果有多个附件怎么办)和传输(如果有多个接收者怎么办)。
这对我来说是个小麻烦,但我不是“dispatch_date”专栏的粉丝。“派遣”一词可以有两个不同的含义。派遣可以是一种信息(例如,一封信,一份手稿)被发送,也可以是当某件东西被发送时。我的建议是避免在设计中多次使用实体名称。如果要使用“分派”来表示已发送的内容,则可以将'dispatch_date‘命名为'creation_ date’、'signed_date‘、'issue_date’、‘signed_date’等,以描述日期的类型。
https://dba.stackexchange.com/questions/273971
复制相似问题