Без описания самих параметров сложно осознать разницу между сущностями, вообще правильность Вашего решения и дать более менее адекватные комментарии. Единственное что могу предположить, исходя из Вашего описания, так это то что Вы не правильно построили иерархию наследования. Если бы она была правильной подобных вопросов не возникало бы. Поэтому Вам стоит ее пересмотреть и заново обдумать
все зависит от проекта ... если у Вас небольшой проект с маленьким объемом данных (имею ввиду данные по которым нужно строить отчет) которым будут пользоваться пару юзеров - тогда проще всего строить отчет на лету.. Если же проект с большим объемом данным, которым постоянно будет пользоваться большое количество юзеров - тогда вполне уместно заранее формировать отчет в БД.
все зависит от того что Вы будете делать дальше с этим маршрутом. Если в последствии Вам необходимо будет применять к маршруту разнообразные алгоритмы тогда стоит хранить данные в БД как неориентированный граф, если же просто будет добавление/вывод маршрута тогда вариант 2 вполне подойдет
1. Все зависит от организации проекта, если например у Вас база данных шардированная - то внешнее ключи как бы Вы не сделаете, или например если Вы хотите избежать проверок на целостность данных при каждом изменении данных, а проводить их самостоятельно раз в сутки. В общем внешние ключи крайне желательны, но бывают ситуации когда стоит их не использовать
2. Не консистентными даными
3. В пункте 1 привел некоторые примеры
Вообще создание кросс-табличных идентификаторов это нормальная практика, другой вопрос - годиться ли этот подход для Вашей задачи. Мне сложно судить т.к. я не понимаю что Вы делаете и какие у Вас требования. Но судя по таблице nodes для решения Вашей задачи реляционная база Вам не особо нужна, поэтому посмотрите в сторону документо-ориентированных баз
1. Null обозначает отсутствие значения. Если у Вас есть столбец который по логике не может быть без значения, но при этом в него можно записать null - это свидетельство плохого дизайна Вашей базы
2. Null-cтобцы как правило жрут дополнительные ресурсы, из за чего скорость обработки данных в базе может уменьшиться. На маленьких объемах Вы этого не заметите, но если будете работать с большой высоко нагруженной базой скорость будет играть огромное значение
Что лучше дальше пытаться подобрать оптимальные варианты составных индексов,
Здесь нужно знать меру, не стоит забывать - чем больше индексов тем больше будет места на сервере занимать база и тем медленнее будет производиться запись данных.
или сделать один составной индекс сразу на 10 полей от А до G например?
Хранить такие данные в сериализованом массиве вообще не тру. Для таких задач либо создаются три таблицы:
- Товары
- Характеристики
- Значение характеристики для товаров
либо используются NoSQL базы данных. А выбор из этих подходов стоит делать исходя из требований и нагрузок Вашей системы.
Вы никак на этапе проектирования точно не угадаете сколько будет занимать тот или иной параметр. Вы можете лишь предполагать, например:
Фамилия - маловероятно что длина фамилии у человека более 30 символов
Имя - маловероятно что длина имени человека более 20 символов.
На основе такого анализа делайте приблизительную длину, а в процессе эксплуатации уже с помощью логирования и системы валидации смотрите что и как.
в BETWEEN первой число это начала диапазона, а второе окончание.
Ваш запрос `user` BETWEEN 1000 AND 100
аналогичен такому: `user`>=1000 AND `user`<=100
как видно из такого условия 500 не больше 1000 и не меньше 100, т.е. нужно формировать запрос так: `user` BETWEEN 100 AND 1000
ошибка возникает в следствии попытки добавить данные с одинаковыми Primary Key. Используйте UPSERT если это позволяет Ваша версия постгреса, если не позволяет - в интернете полной информации как реализовать самому его аналог в более старых версиях.
что касается null в MySQL от него по возможности нужно избавляться (только ж без фанатизма). Нужно понимать что для каждого типа данных нужно использовать свое значение по умолчанию, если тип строка - тогда лучше "", если число - тогда 0 и т.п. Ну и соответственно значение по умолчанию будет занимать столько места сколько занимает сам тип столбца. Подробнее о размерах типов данных можно почитать здесь