Database design 是否使用外键或重复的表列?

Database design 是否使用外键或重复的表列?,database-design,Database Design,我有一个带有列的联系人表: 身份证 名称varchar(50) 美孚利诺 当我的系统尝试发送消息时,它会在另一个表MSG_log中写入日志,其中包含以下列: 身份证 名称varchar(50) 美孚利诺 信息 datetimecreated 我的问题1:这是一个好的设计吗?这可能是一种更好的方式(见下文) 味精日志 身份证 联系人id(fk) 信息 datetimecreated 问题2:我关心的是,如果有一天我们需要将Contact.name从varchar(50)扩展到varch

我有一个带有列的联系人表:

  • 身份证
  • 名称varchar(50)
  • 美孚利诺
当我的系统尝试发送消息时,它会在另一个表MSG_log中写入日志,其中包含以下列:

  • 身份证
  • 名称varchar(50)
  • 美孚利诺
  • 信息
  • datetimecreated
我的问题1:这是一个好的设计吗?这可能是一种更好的方式(见下文)

味精日志

  • 身份证
  • 联系人id(fk)
  • 信息
  • datetimecreated
问题2:我关心的是,如果有一天我们需要将Contact.name从varchar(50)扩展到varchar(100),该怎么办。我们忘记扩展MSG_LOG.contact_id的可能性有多大


有什么建议吗?

一个更重要的问题是:当某人的姓名或手机号码发生变化时会发生什么

在第一种设计中,您保留了发送消息时他们的姓名和手机号码的记录

在第二个设计中,您可以指向更新后的名称和编号


(根据您需要的历史记录,您甚至可能需要第三个选项:联系人id、姓名和电话号码,全部在MSG_日志中。)

更重要的问题是:当某人的姓名或手机号码发生变化时会发生什么

在第一种设计中,您保留了发送消息时他们的姓名和手机号码的记录

在第二个设计中,您可以指向更新后的名称和编号

(根据您需要的历史记录,您甚至可能需要第三个选项:联系人id、姓名和电话号码—全部在MSG_日志中。)

使用SQL别名类型—在SQL Server中:

CREATE TYPE name_type FROM varchar(50) not null
使用SQL别名类型--在SQL Server中:

CREATE TYPE name_type FROM varchar(50) not null
问题1。答案。 不要在MSG_日志表中再次使用MobileNo和Name

如果ContactId变为FK,那么您可以轻松地从两个表中获取所有内容

因此,只需使用

MSGID PK[它应该是自动递增的] MSGTEXT 发送日期\时间 联系人ID FK

及 如果重复发送消息,则还应创建一个消息表,并在MSGLOG表中将ContactId、MessagesId用作FK,并将信息较少的msg和contacts用作第三个标准化。始终在msg集合中保存新的msg一次并重复使用。如果msg重复,则应执行此操作。它还可以节省前端视角的时间。

Q1。答案。 不要在MSG_日志表中再次使用MobileNo和Name

如果ContactId变为FK,那么您可以轻松地从两个表中获取所有内容

因此,只需使用

MSGID PK[它应该是自动递增的] MSGTEXT 发送日期\时间 联系人ID FK


如果重复发送消息,则还应创建一个消息表,并在MSGLOG表中将ContactId、MessagesId用作FK,并将信息较少的msg和contacts用作第三个标准化。始终在msg集合中保存新的msg一次并重复使用。如果msg重复,则应执行此操作。从前端角度来看,这也节省了时间。

这取决于DBMS,但大多数常见的DBMS(SQL Server、PostgeSQL、MySQL等)都有。谢谢!这帮了大忙。但我不想仅限于SQL Server。希望这个解决方案也能支持MySQL。(SQL Server、MySQL和PostgreSQL在我的环境中经常使用)哦,你回答了。这取决于DBMS,但大多数常见的数据库(SQL Server、PostgeSQL、MySQL等)都有。谢谢!这帮了大忙。但我不想仅限于SQL Server。希望这个解决方案也能支持MySQL。(SQL Server、MySQL和PostgreSQL在我的环境中经常使用)哦,你回答了。谢谢!现在我明白了,谢谢!现在我明白了。