Първият е по-нормализиран, макар и леко непълен. Има няколко подхода, които можете да предприемете, като най-простият (и строго погледнато, най-„правилният“) ще се нуждае от две таблици, с очевидното FK ограничение.
commentid ---- subjectid ----- idType
--------------------------------------
1 22 post
2 26 photo
3 84 reply
4 36 post
5 22 status
idType
------
post
photo
reply
status
Ако желаете, можете да използвате char(1) или подобен, за да намалите влиянието на varchar върху дължината на ключа/индекса или да улесните използването с ORM, ако планирате да използвате такъв. NULL винаги са проблем и ако започнете да ги виждате във вашия дизайн, ще бъдете по-добре, ако можете да измислите удобен начин да ги премахнете.
Вторият подход е този, който предпочитам, когато се занимавам с повече от 100 милиона реда:
commentid ---- subjectid
------------------------
1 22
2 26
3 84
4 36
5 22
postIds ---- subjectid
----------------------
1 22
4 36
photoIds ---- subjectid
-----------------------
2 26
replyIds ---- subjectid
-----------------------
3 84
statusIds ---- subjectid
------------------------
5 22
Разбира се, има и (леко денормализиран) хибриден подход, който използвам широко с големи набори от данни, тъй като те са склонни да бъдат мръсни. Просто предоставете таблиците за специализация за предварително дефинираните idTypes, но запазете колона adhoc idType в таблицата commentId.
Обърнете внимание, че дори хибридният подход изисква само 2 пъти пространството на денормализираната таблица; и осигурява тривиално ограничение на заявката чрез idType. Ограничението за интегритет обаче не е директно, тъй като е FK ограничение за производно UNION на типовите таблици. Моят общ подход е да използвам тригер или върху хибридната таблица, или еквивалентен изглед с възможност за актуализиране, за да разпространявам актуализации към правилната таблица с подтипове.
Работят както простият подход, така и по-сложният подтипов таблицен подход; все пак, за повечето цели се прилага KISS, така че просто подозирам, че вероятно трябва просто да въведете таблица ID_TYPES, съответния FK, и да приключите с това.