Няколко точки:
Изглежда, че просто използвате това, което в момента е уникално за таблицата и го правите като първичен ключ. Това работи. А естествените ключове имат някои предимства, когато става въпрос за запитване поради локалност. (Данните за всеки потребител се съхраняват в една и съща област). И тъй като таблицата е групирана от този ключ, който елиминира търсенето на данните, ако търсите по колоните в основния.
-
Но използването на естествен първичен ключ, както сте избрали, има и недостатъци за производителността.
-
Използването на много голям първичен ключ ще направи всички други индекси много големи в innodb, тъй като първичният ключ е включен във всяка стойност на индекса.
-
Използването на естествен първичен ключ не е толкова бързо, колкото сурогатен ключ за INSERT, защото освен че е по-голям, той не може просто да се вмъква в края на таблицата всеки път. Трябва да се вмъкне в секцията за този потребител и публикация и т.н.
-
Освен това, ако търсите по време, най-вероятно ще търсите по цялата таблица с естествен ключ, освен ако времето не е първата ви колона. Сурогатните ключове обикновено са локални за времето и често могат да бъдат подходящи за някои заявки.
-
Използването на естествен ключ като вашия като първичен ключ също може да бъде досадно. Ами ако искате да се позовавате на конкретен вот? Трябват ви няколко полета. Също така е малко трудно да се използва с много ORM.
Ето отговор
Бих създал ваш собствен сурогатен ключ и бих го използвал като първичен ключ, вместо да разчитам на вътрешния първичен ключ на innodb, защото ще можете да го използвате за актуализации и справки.
ALTER TABLE tbl_rate
ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY(id);
Но ако създадете сурогатен първичен ключ, бих направил и вашия ключ УНИКАЛЕН. Същата цена, но налага коректност.
ALTER TABLE tbl_rate
ADD UNIQUE ( user_id, post_id, type );