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)
- 美孚利诺
- 身份证
- 名称varchar(50)
- 美孚利诺
- 信息
- datetimecreated
- 身份证
- 联系人id(fk)
- 信息
- datetimecreated
有什么建议吗?一个更重要的问题是:当某人的姓名或手机号码发生变化时会发生什么 在第一种设计中,您保留了发送消息时他们的姓名和手机号码的记录 在第二个设计中,您可以指向更新后的名称和编号
(根据您需要的历史记录,您甚至可能需要第三个选项:联系人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在我的环境中经常使用)哦,你回答了。谢谢!现在我明白了,谢谢!现在我明白了。