使用外键还是重复表列?

时间:2013-12-13 09:03:23

标签: database-design

我有一个包含列的CONTACT表:

  • id
  • name varchar(50)
  • mobileno

当我的系统尝试发送消息时,它会在另一个表MSG_LOG中写入一个包含列的日志:

  • ID
  • name varchar(50)
  • mobileNo
  • 消息
  • datetimecreated

我的问题#1:这是一个好设计吗?这可能是一种更好的方法(下图)。

MSG_LOG

  • ID
  • contact_id(fk)
  • 消息
  • datetimecreated

问题2:如果有一天我们需要将Contact.name从varchar(50)扩展到varchar(100),我的担心是什么。我们忘记扩展MSG_LOG.contact_id的可能性有多大?

任何指针?

3 个答案:

答案 0 :(得分:2)

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

使用第一种设计,您可以在发送邮件时保留其姓名和手机号码的记录。

使用第二种设计,您可以回到更新的名称和编号。

(根据您需要的历史记录,您甚至可能需要第三个选项:MSG_LOG中的联系人ID,姓名和号码。)

答案 1 :(得分:2)

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

CREATE TYPE name_type FROM varchar(50) not null

答案 2 :(得分:0)

Q1。答。 在MSG_LOG表中不要再使用MobileNo和Name。

如果ContactId成为FK,那么很容易就可以从两个表中获取所有内容。

所以只需用

创建MSG_LOG表

MSGID PK [它sholud会自动递增] MSGTEXT sendingdate_time ContactID FK

和 如果您的消息被重复,您还应创建一个Messages表,并在MSGLOG表中使用ContactId,MessagesId作为FK,并将msg和具有较少信息的联系重用为第三标准化。总是在msg集合中保存一次新的msg并重复使用它们。如果重复msg,那么你应该这样做。同时也为前端观点节省了时间。