2013-12-13 40 views
0

我有列的聯繫表:使用外鍵還是重複表列?

  • ID
  • 名VARCHAR(50)
  • mobileno

當我的系統嘗試發送消息時,它會寫日誌另一張表MSG_LOG帶列:

  • id
  • 名VARCHAR(50)
  • mobileNo
  • 消息
  • datetimecreated

我的問題#1:這是一個好的設計?這可能是一個更好的方法(下)。

MSG_LOG

  • ID
  • CONTACT_ID(FK)
  • 消息
  • datetimecreated

問題2:我擔心的就是如果哪天我們需要擴大Contact.name從varchar(50)到varchar(100)。我們會忘記擴展MSG_LOG.contact_id的機會是多少?

任何指針?

回答

2

更重要的問題是:當某人的姓名或手機號碼發生變化時會發生什麼?

通過第一種設計,您可以在郵件發送時保留其姓名和手機號碼的記錄。

使用第二種設計,您可以指向更新的名稱和編號。

(根據您所需要的歷史,你甚至想要第三個選項:接觸式ID,名稱和數量都在MSG_LOG。)

+0

謝謝!現在我明白了。 – CodeBender

2

使用SQL別名類型 - 在SQL Server是:

CREATE TYPE name_type FROM varchar(50) not null 
+0

這將取決於DBMS,但最常見的(SQL Server,PostgeSQL,MySQL等)擁有它們。 –

+0

謝謝!這非常有幫助。但我不想僅限於SQL Server。希望解決方案也可以支持MySQL。 (SQL Server,MySQL和PostgreSQL在我的環境中經常使用) – CodeBender

+0

哦,你有答案。 – CodeBender

0

Q1。答。 請勿移動,並在MSG_LOG表中再次命名。

如果ContactId變成FK,那麼很容易你可以從這兩個表中獲取所有東西。

所以剛纔創建MSG_LOG表

MSGID PK [它sholud將自動遞增] MSGTEXT sendingdate_time 的ContactID FK

和 如果你的消息被重複的,你應該建立一個信息表還與在MSGLOG表中使用ContactId,MessagesId作爲FK,並重復使用msg和包含較少信息的聯繫人作爲第三規範化。總是在msg集合中保存新的msg並重新使用它們。如果msg被重複,那麼你應該這樣做。對於前端的觀點來說也是節省時間的。