Несколько таблиц с общими полями(Навеяно темой Дата записи MySql)
Я бы вобще сделал 3 таблицы.
1 - с общими данными
две другие имеют данные свойственны каждой из сущосностей. и связал их по ПК.
Это сразу дает возможность без каких либо потерь и головной боли расширить сущонсть в будущем. Например, нужно будет ввести автора статьи, или еще что-то
а про поля created_at и modificated_at, эт да - удобно. Я щас на symfony+doctrine пишу проэкт, так тут вобще в схеме задется деректива и ОРМ сама генерит эти поля и сама их заполняет
2Lone Wolf Без этого тоже замечательно делается)) Можешь создать топик - обсудим или в личку.
Есть 3 таблицы. Новость, Статья, Фотография
Общее у таблиц это Автор(ФК ключ), Город(ФК ключ), Название, Текст
Собственное, Новость - дата. Статья - категория(ФК), Фотография - пусть будут координаты.
К каждой сущности подвязываются комментарии и тэги.
Я выносил общие даные в одну таблицу и для каждой сущности создавал свои с собственными поялми.
Плюсы что я вижу, Нету пустых не использываных полей в таблицах если делать одну большую.
Легче подвязывавть коментарии и тэги. Подвзязываются к одной таблице(случай 3х абсолютно разных таблиц)
Минус - много JOIN-ов.
А теперь интерестна альтарнатива. как можно было бы сделать прощею
P.S. Создал тему, так как думаю не только мне будет такое интерестно
Хм. Вариант
Но получается для выбора всех комментов к конкретной сущности нуже JOIN
И в случае удаления сущности, прийдется руками перебирать. таблицу link для удаления всех комментов.. Конечно это не сложно, но все же..
Аналогично при удалении коммента.
также parentName и childName и нужно либо Enum-ом делать, либо где-то хардокидить их перечень.. но это скорее для удобства..
И еще один момент. Я использую symfony+Doctrine(1.2)
Все запросы(большинство) пишуться на ее собственом языке DQL и все джоины делаются через алиасы, о которых знает только Доктрина.
Т.е. Для без проблемной выборки всех комментов для конкретной новости нужна явная связка по ФК...
А в случае такой таблицы прийдется либо писать кастомный запрос, что не очень удобно, потому что на выходе получить модель будет невозможно(будет просто масив данных) либо делать несколько запросов. Сперва вытьянуть все ИДшники комментов, а потом вытягивать сам комменты, что тоже сомнительное удовольствие.
PS Как рабочий вариант (вне CMS) я так же рассматривал вариант вынесения сущностей, который 100% будут потомками (например те же комменты) и делать у них 2 доп поля - entityName, entityId.
получил имя класса с БД, вбил в переменную и используешь ее в виде $class->get('field'), ну или как там в ОРМке твоей.
У меня введение ENUM-а в похожей ситуации было нужно для сфинкса. тип записи был атрибутом при поиске.
Хотя потом вычитал про sql_attr_str2ordinal вроде им можно было обойтись..
SELECT childId FROM __links WHERE parentId = 12 AND parentName = 'News' AND childName = 'Comment'
Этим самым я получал id всех комментов к новости и мне нужно было всего лишь выдернуть их из кеша. Для средних и небольших проектов на мой взгляд это идиальная система (на больших возникает проблема с линковочной таблице, она хоть и узкая, но высокая получается и начинает всё притормаживать, хоть кеш на уровне вьюх спасает конечно). А вообще реально гибко и красиво :)) Самое главное, что это ооочень легко поддерживается :)))
Единственное что
Но даже в данном случае можно попытатся извернутся. Безвыходных ситуаций не бывает.
А можно еще глупый вопрос? Линковочная таблица - это что? Это термин, или это реальная таблица?
(не пинайте сильно)
я Вам в icq постучал
Да, именно так + имена табли (в моём случае), но можно и на каждое отношение свою таблицу.
Минус - много JOIN-ов.
А что собственно плохого в join'ах ? Мне наоборот говорили, что join намного лучше и опреративнее в работе, чем таблица с кучей полупустых полей?
Или есть подводные камни? (Сложность запроса не считается)
1. join
2 LIKE %string%
3. вложенный запрос