База данных - Динамический выбор таблицы - PullRequest
2 голосов
/ 20 января 2011

У меня странная проблема, и я не могу найти ответ где-нибудь.Я создаю небольшое приложение Ruby on Rails для расчета затрат на электроэнергию.

Для этого мне нужно знать, по какому тарифу может работать человек, что подходит для обычных тарифов.(Например, обычно люди устанавливают определенную цену за киловатт для дня и ночи => Таблица тарифов со статическими данными для каждого типа тарифа) * ​​1003 *

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

Я думал о чем-то вроде этого:
Таблица клиентов => ID, Имя, TariffID и т. Д. И т. Д.
Таблица тарифов => ID, Введите
Статическая тарифная таблица => ID, Стоимость за киловатт, TariffID и т. Д.
Динамическая тарифная таблица => ID, Стоимость за киловатт, TimeStamp, TariffID

И затем в зависимости от типа тарифав таблице тарифов я хотел бы использовать статическую или динамическую таблицу.

Кроме того, мне нужно записать временную метку каждого динамического тарифа, чтобы рассчитать стоимость каждого часа дня в сравнении с использованием электроэнергии для каждого часадень, но мне не нужно это для статического;)

Мне это кажется немного тяжелым, и мне было интересно, если кто-нибудь может предложить более тонкое решение?

Заранее спасибо,

Симус

Ответы [ 2 ]

2 голосов
/ 20 января 2011

Возможно, вы захотите прочитать о Single Table Inheritance - это похоже на хороший вариант использования.

В этом вопросе переполнения стека есть много полезной информации .

Похоже, вам нужна таблица тарифов, класс Tariff со всем вашим общим кодом, а затем классы StaticTariff и DynamicTariff, которые наследуются от Tariff. Таким образом, вы можете переопределить методы в подклассах для расчета стоимости за час. StaticTariff будет легким, поскольку он, вероятно, возвращает значение столбца в вашей базе данных, в то время как DynamicTariff, вероятно, должен выполнить вычисление на основе даты / времени.

Любой общий код между ними можно безопасно поместить в родительский класс Tariff, и вы должны быть в пути.

0 голосов
/ 20 января 2011

Могут ли ваши пользователи со временем переключать тарифы, например со статического на динамический? Если это так, вашей схемы будет недостаточно.

Кроме того, вы не говорите, если существует более одного динамического тарифа, основанного на времени.

Использование STI может помочь вам и подходит в том смысле, что StaticTariff и DynamicTariff оба проходят тарифный тест «является». Однако эти две конкретные реализации достаточно различны, так что, вероятно, нет смысла хранить их детали в одной таблице.

Я бы предложил что-то вроде общего API для обоих по линии TariffCalculator.cost(:user => user, :time_range => time_range) и занялся бы внутренним выбором конкретной реализации. На этом этапе не зацикливайтесь на структуре базы данных, просто сосредоточьтесь на том, чтобы интерфейс был чистым и хорошо протестированным. Таким образом, вы можете безнаказанно рефакторинг позже: D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...