2015-08-26 18 views
-2

有一張桌子。沒有PK,2 FK,有一些任意數量的列。 不幸的是FK在任何方面都不是唯一的。可更新的主要或獨特的鑰匙

添加新數據很容易。

刪除數據(找到一行)是好的,如果我把一個獨特的約束其他col。
DELETE ... WHERE fk1=:fk1 AND fk2=:fk2 AND ucol=:ucol

如何處理UPDATE

我不能使用那個ucol,因爲同樣的ucol可能是變化的主題。我有幾個解決方案,但沒有一個看起來不錯。

解決方案1:
把PK放在表中。將其用於DELETE和UPDATE。刪除會造成很多漏洞,但這沒有問題。從理論上講,如果發生一些重大的刪除操作,它可能會用完PK號(int,unsigned int)。

Solution1a 使CK(fk1,fk2,某個新col)用於定位該行。和使用PK一樣。

溶液2
與microtime中/散列/唯一的密鑰生成器/使用的東西時間戳來填充新的獨特的山坳。該col用作PK來定位UPDATE和DELETE行。只有當獨特的算法才能完美地工作時,它纔是絕佳的。

我的問題: 有什麼更好的嗎?這不需要花哨的算法,並且不會有自動遞增PK溢出的風險...

-----------------編輯-------- --------
Solution2a
使用mysql UUID!它比創建自定義時間戳/散列/ something_unique好得多(也更容易使用)。

+0

沒有更多的上下文很難回答。你怎麼能耗盡4 + 10億* PK? – rlanvin

+0

我說'理論上',我沒有:)如果那是當前人類知識的高峯,我會使用PK。但如果不是,我很想知道更好的解決方案。 – CoR

+0

如果你擔心溢出一個整數PK,你總是可以使用一個GUID,但我會堅持標準的自動增量,除非你非常確定你會溢出 –

回答

2

按我的建議,這將是更好的PK添加到表的原因如下:
1.它會給唯一ID的每一行,這將有助於在的DELETE和UPDATE腳本。
2. PK將在列上創建一個集羣索引,這將提高數據檢索的性能。
3.它總是建議在每個表格中提供PK。
4.將來如果需要,您可以在任何表格中使用PK作爲FK。

+0

感謝您的回答。我對PK沒有問題,我只是想知道是否有更好的方法。 GUID是迄今爲止的第三個解決方案:) – CoR

+0

值得一提的是PK或UUID是唯一的解決方案。 – CoR