• Множество сущностей, связанных с одной таблицей. Хорошо ли это?

    copist
    @copist
    Empower people to give
    Такой подход позволяет использовать сквозные ID и уменьшать количество связей в БД, не теряя целостности.
    Например, не комментарии к фильмам, комментарии к записям блога, комментарии к товару в интернет магазине, комментарии в ленте пользователя, а иначе - "комментарии к записи базового типа".

    Применение указанной тобой формы или, наоборот, нормализация её - это исходит из бизнес-требований. Структура таблиц следует из анализа предметной области, а не потому что "так правильно" или "так красивее". Если модель хранения подходит для конкретного применения - это хорошая модель. Зачастую моделей может быть несколько, приходится выбирать одну исходя из требований. Для реальных задач может даже пригодиться ненормализованные данные (JSON) хранить в реляционной базе. А вот если идеальная красивая понятная модель по третьей нормальной форме не способна реализовать потребность с учётом простоты, объёмов, надёжности, гибкости, быстроты - это никому не нужная модель.

    С точки зрения объектно-ориентированного программирования - это как создать производный класс от родительского. Например, контрагенты - это либо физ лицо, либо юр лицо, но совсем не обязательно заводить под них две таблицы, можно обойтись одной, хотя в приложении такие сущности будут значительно отличаться.

    Или вот ещё пример: в системе может быть пользователь (user), который вдруг может стать продавцом (supplier) или потребителем (customer). Их можно хранить в одной таблице (user = customer = supplier), если отличие - в каком-нибудь признаке "is_сustomer" и "is_supplier".
    Если у них разные дополнительные атрибуты, например у продавца есть банковский счёт, а у покупателя - счёт в PayPal, у продавца - адрес хранения товара, а у покупателя - адрес доставки - то часть полей одной записи таблицы user используется для покупателя, а часть - для продавца
    table `user`
      column `id` as primary key
      column `full_name` - общее поле
      column `is_supplier` - продавец
      column `is_customer` - покупатель
      column `shipping_address` - адрес доставки покупателя
      column `store_address` - адрес хранения продавца
      column `bank_account` - банковский счёт продавца
      column `paypal_account` - счёт покупателя

    Схема условная

    Но можно в одной таблице хранить только общие поля, а в дополнительных таблицах дополнительные поля. Сквозной ID сохраняется, даже нормальные формы работают.

    table `user`
      column `id` as primary key
      column `full_name` - общее поле
      column `is_supplier` - продавец
      column `is_customer` - покупатель
    
    table `supplier`
      column `id` as primary key & foreign key to `user`:`id`
      column `shipping_address` - адрес доставки покупателя
      column `bank_account` - банковский счёт продавца
    
    table `customer`
      column `id` as primary key & foreign key to `user`:`id`
      column `store_address` - адрес хранения продавца
      column `paypal_account` - счёт покупателя

    Схема условная
    Тут указано, что их надо связывать отношением "один-к-одному".

    Вообще грань очень незаметна. В любом случае в сложной схеме то на одни, то на другие грабли приходится наступать. Тут сквозные ID и избыток колонок в записи, а тут лишние UNION или JOIN, чтобы собрать вместе в одном отчёте. Если этот отчёт потребуется :)

    Хранение сущностей в одной таблице относится к теме "Наследование в реляционных моделях" (не могу точно найти определение). Можно дополнительно прочитать тут:

    www.sql.ru/forum/67152/nasledovanie-v-baze-dannyh
    https://msdn.microsoft.com/ru-ru/library/bb531247.aspx
    postgresql.ru.net/manual/ddl-inherit.html
    https://habrahabr.ru/post/28023/
    https://habrahabr.ru/post/322596/
    Ответ написан
    Комментировать
  • Реализация свойства как объекта: паттерн или антипаттерн?

    lxsmkv
    @lxsmkv
    Test automation engineer
    попробуйте написать для ваших объектов юнит-тесты - если это будет легко и удобно - архитектура годная.
    Ответ написан
    Комментировать
  • Какие паттерны могут спросить на собеседовании у C# ASP.NET разработчика?

    EreminD
    @EreminD
    Кое-что умею
    Тадам!
    Кстати, про SOLID любят часто поговорить
    Ответ написан
    Комментировать
  • Какие паттерны могут спросить на собеседовании у C# ASP.NET разработчика?

    OrenTiger
    @OrenTiger
    .NET Developer
    Одни из самых часто используемых: Фабрика/Абстрактная фабрика, Стратегия, Строитель, Декоратор (или Wrapper)
    Ответ написан
    Комментировать