首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在办公室信件发送系统中,我应该使用单独的表还是组合表?

在办公室信件发送系统中,我应该使用单独的表还是组合表?
EN

Database Administration用户
提问于 2020-08-19 07:47:10
回答 1查看 48关注 0票数 -1

我正在使用PHP MySQL创建一个办公信函分发系统,其中office Division是唯一的id分派项,可以由division_id分割。

通过添加列字母类型,我可以将InwardOutward发送信函组合在一个表中。

我决定做两张桌子,一张是Inward的,一张是Outward

代码语言:javascript
复制
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;

请帮我把它做得更好,桌子之间的关系是什么?专家建议受到高度赞赏。

EN

回答 1

Database Administration用户

发布于 2020-08-19 19:06:33

我将创建一个带有分派类型列的调度表。这两个表是相同的,这表明它们是同一个实体。同时,内向和向外是模糊的,因为内/向外相对于什么?像这样模糊的术语说明了数据模型的问题。有两个调度表会使引用特定的分派变得更加困难。

这两张桌子之间有关系吗?在这种情况下,内向vs向外没有帮助--在这种关系中,哪个表是主表。考虑下面的示例,说明如何使用一个调度表和另一个表显示关系。

代码语言:javascript
复制
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
);

还有一些其他设计要点需要考虑:

  • 如果某物是日期,则使用日期数据类型,而不是varchar。
  • 建议对本质上是数字或关系键的项使用数字。除非状态是一个数字返回代码,否则我将使用一个描述性字符串(例如,sent_status应该是'UNSENT‘、’发送‘、’传递‘等)或一个布尔值(例如,sent_status是T/F)。
  • 我避免用复数词作为表名。存储在一行中的实体是一个调度,而不是多个调度。

应该避免将日期存储为字符串,因为在格式中执行一致性变得更加困难,算术操作变得更昂贵,而且日期间隔更昂贵。

较早的数据库设计通常出于性能原因使用数字作为标记(字符串比较比整数比较昂贵),但对于大多数实现来说,这通常不是一个问题。在我的经验中,数字标记的使用使新用户难以使用,并削弱了与底层模型的关系。例如,假设sent_status=47与sent_status='QUEUED',哪个更容易理解?

数据库规范化中有一种很好的艺术,你的桌子也很好。看起来,您已经将两个不同的实体合并到一个表中。我建议您考虑是否有不同的模型可能更适合您的应用程序。例如,您可能希望拆分内容(如果有多个附件怎么办)和传输(如果有多个接收者怎么办)。

这对我来说是个小麻烦,但我不是“dispatch_date”专栏的粉丝。“派遣”一词可以有两个不同的含义。派遣可以是一种信息(例如,一封信,一份手稿)被发送,也可以是当某件东西被发送时。我的建议是避免在设计中多次使用实体名称。如果要使用“分派”来表示已发送的内容,则可以将'dispatch_date‘命名为'creation_ date’、'signed_date‘、'issue_date’、‘signed_date’等,以描述日期的类型。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/273971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档