Добрый день, делаю небольшую систему умного дома на laravel, таким образом знакомлюсь с фреймворком и orm.
Есть задача вносить в базу данных датчики и устройства, они делятся на 3 типа:
1. реле - их можно только включить и выключить
2. датчики температуры, влажности и остальные которые возвращают значения, для них необходимо заложить возможность установки таймера, по которому будет произведен опрос
3. датчики моментального действия, к примеру движения, им необходимо заложить особое свойство, которое будет говорить что датчик без таймера
И встает вопрос как грамотно спроектировать такую связку, колхозным классическим методом представляю, а как всё это вложить в парадигму laravel не понимаю.
Сейчас есть понимание что нужно создать 3 модели:
1. Units - общая таблица всех возможных датчиков
2. UnitProperties - свойства этих датчиков (таймер, моментальный опрос, включить выключить)
3. DeviceUnits - соотношение платы умного дома и непосредственно уникального датчика
Получается ещё нужна модель где будут описаны взаимоотношения DeviceUnit и UnitProperties или нет? Как соотнести в конце функционал отдельный каждого датчика и непосредственно поведение датчика на плате.
И все таки мне кажется удобнее было бы под каждый датчик завести свой контроллер и свою модель.
Так как они выполняют достаточно разные функции и значения у них тоже разные. Если мы пытаемся термометр у которого значение одно и в градусах, связать в единой таблице с датчиком ИК движения у которого свойств может быть уже 5 и естественно в совершенно других значениях. Что вынуждает нас либо нарушать все возможные НФ, либо плодить кучу связных таблиц. или же еще хуже использовать модель EAV
Мы знаем все о наших датчиках и платах поэтому можно не пытаться делать их универсальными гораздо проще будет работать с датчиком как с конкретным элементом это будет и приятнее и более функционально и меньше геморроя вы попытках все делать универсальным помните про KISS
думаю что вряд-ли в системе будут датчики и платы добавляться каждый день -> ничто не мешает считать каждый датчик за отдельную сущность с его параметрами и функциями
в этих же контроллерах модели в бд храним поведение датчика на плате опять все просто и легко
в конце концов SQL хорош когда нам нужна целостность данных) а тут можно вообще все в паре ключ значение запихать в REDIS и не париться вообще + работать будет быстрее)
Спасибо за содержательный ответ, он ответил на часть вопросов но вызвал ещё несколько:
Как сделать форму прикрепления датчика к устройству, к примеру, определили модели
TemperatureUnit (ФирмаДатчика1, ФирмаДатчика2)
RelayUnit (ФирмаДатчика1, ФирмаДатчика2)
и под эгидой устройства модель
DeviceUnit
по логике запрос к которой должен отдать все датчики любых типов, для вывода листинга датчиков устройства.
Так же в форме добавления изначально нужно выбрать тип датчика, потом фирму, потом описать его свойства(периодичность опроса - таймер), реально ли это исполнить в одной форме, либо делать 2 формы: добавление датчиков температуры, добавления релейных блоков?
Какой механизм можно применить для решения задачи?
ну тут много путей) я попробую конечно вникуться без тонкостей. Прикрепление датчиков к плате
У нас есть табличка с платами
id name type
1 arduino_nano_bedroom 0
2 arduino_nano_kitchen 0
3 arduino_pro_bedroom 0
в сущность датчика мы создаем поле arduino_id и вешаем сюда внешний ключ на arduino.id
При создании параметров датчика мы заполняем это поле -> связка платы и датчика по внешнему ключу готова.
Опять же пытаетесь сделать все универсальным)
Сделайте в админке подраздел с каждым типом датчиков который у вас есть и под него свою вьюху с нужной вам формой) в этом нет абсолютно ничего плохого так как проект не будет большим и сложностей для его изменения или масштабирования не будет в данном случае.
Если датчиков одного типа будет много а не по одному (как я предположил изначально) то можно их сгруппировать по типу и сзодать отдельную табличку для них и модель делать не для датчика а группы датчиков)
если расскажете более подробно то можете написать мне в телеграм @danya_j23 и я смогу сказать что-то более подробно) к тому же у меня тоже появился интерес к вашему проекту и некоторые вопросы