Стандартизация таблиц и полей в БД

Здравствуйте.

Долго пускал слюни на Yii и вот таки решился переписать свой кустарный фреймворк на чем-то более потребном и очевидном. В принципе, пролистал доки, вроде пока все понятно. Непонятно лишь, как лучше сделать БД. К слову, логические нестыковки были и ранее, а здесь захотелось сделать все сразу и красиво, оттого вопросов добавилось. В доке Yii пишут то так то эдак.

Итак, основной вопрос в организации реляционных таблиц. К примеру, есть модель User, есть модель Site. У User и Site может быть группа, у User может быть комментарий. Модели групп разные для юзера и сайта. Таким образом, если комментарий можно назвать Comment, т.к. он связан только с моделью User. То с группой не все так просто. Как я у себя это делаю: создаю две модели - UserGroup и SiteGroup

Вопрос №1. Логичнее ли модель Comment также жестко связывать с моделью User и называть ее в БД user_comment (ну и саму модель назвать UserComment), дабы не было путаницы? А то мало-ли, потом мне придется сделать другую модель, к примеру SiteComment и придется делать рефакторинг.

Вопрос №2. При условии связи user и user_group Внутри user должно быть поле с идентификатором PK user_group Так вот, как называть это поле? Есть два варианта, локальный и глобальный (это я их так назвал) Т.е. group_id и user_group_id С первым вариантом будет удобнее работать ($User->group_id вместо $User->user_group_id), но в последствии могут возникнуть коллизии, если будет какая-нибудь модель SiteGroup и в User надо будет прописывать и ее. Получится две group_id

Второй вариант универсальный, но громоздкий.

Вопрос №3. Если именовать таблицы как и модели, в единственном числе, то как именовать таблицы реляций MANY_TO_MANY? Есть таблицы user, есть user_group Какой таблицей их связать? Неужели user_user_group?

Я сейчас абстрагируюсь от Yii, а пытаюсь рассуждать логически. А здесь запостил, потому что здесь одно из самых рациональных комьюнити :)

Заранее спасибо за ответы.

Если есть вероятность того, что появятся какие-то другие комментарии, то логичнее. Более того, если известно, что комментарий относится только к пользователю, то я считаю, что называть нужно с префиксом User в любом случае. Просто Comment создает впечатление, что это общая таблица комментариев и для пользователей, и для сайтов.

Возможно, длинный вариант удобнее при ручном написании SQL запросов (не нужно задавать псевдонимы), но это тоже сомнительно. Получается и остальные поля надо именовать “user_name”, “user_register_date” и т.п., ведь в связанных таблицах тоже могут поля “name” и “register_date”. Если работать через ActiveRecord (и прочитать мануал :) ), то никаких “коллизий” возникать не будет.

А как душе угодно :) “user_user_group” вполне логичное название, и меня совсем не смущает.

MySQL Workbench именует такие таблицы как user_has_user_group. По моему неплохой вариант и с точки зрения смысла и визуально легко понять, что это связочная таблица, по характерному has в середине.

Можно утрамбовать так

  • таблица user

  • таблица comment (содержит внешние поля commenting_id, commenting_type)

  • таблица group (содержит по аналогии с комментами grouping_id, grouping_type)

  • таблица site

Соотв поля commenting_type и grouping_type содержат названия моделей, к которым принадлежит конкретный коммент или группа.