best practice - это стандартные для framework решения, например:
public function getReviews()
{
return $this->hasMany(Review::className(), ['id' => 'review_id']);
}
такие связи хорошо документированы и не совсем понятно, чем они Вас не устраивают?
Возможно у Вас есть конкретная проблема, которую Вы не знаете как можно решить? Тогда опишите детальнее.
Вариант по ссылке - это поведение, для модели. По сути попытка вынести часто используемые методы в поведение и упростить их использование. Но при этом попытки универсализации этого класса, привели к потере производительности в некоторых местах. На мой взгляд подход с поведениями здравый, но надо писать под проект свои поведения и не вижу смысла выносить связи в них.