Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 24, 2015 17:24:23

TitanFighter
Зарегистрирован: 2015-06-23
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Пару нубских вопросов на тему "Как правильно связать таблицы?"

Мне нужно хранить:
1) Даты премьер фильмов (мировая, в США, России и Украине - это по минимуму)
2) Даты сеансов
3) Время сеансов

Задача:
1) Выводить даты премьер как статическую информацию отдельной строкой + делать выборку (фильтр во фронт-енде) фильмов по датам премьер (по неделям, по месяцам, годам).
2) Выводить даты сеансов как статику + делать выборку (фильтр во фронт-енде).
3) Выводить время сеансов как статику + делать выборку (фильтр во фронт-енде)
4) Выводить в названии, или отдельной строкой + делать выборку (фильтр во фронт-енде) фильмов по годам производства (class Movie -> production_year).

На данный момент, после правок полей, модель выглядит в сокращенном виде так:

class Country(models.Model):
   name
   short_name
class Profit(models.Model):
    weeks
    weekend_profit
    weekend_ppl
    total_profit
    total_ppl
    premier_date
    movie = models.ForeignKey(Movie)    
    country = models.ForeignKey(Country, null=True)    # null == world
#############################################
class Cinema(models.Model):
    movie = models.ManyToManyField(Movie, through='MoviesTimetable')    
    city
    name
    street
    phone
class Movie(models.Model):
    # новое поле
    production_year
    name
    length
    genre
    description
class MoviesTimetable(models.Model):
    movie = models.ForeignKey(Movie)
    cinema = models.ForeignKey(Cinemas)
    dates
    times
Как я себе это изначально представлял:
- Даты премьер (class Profit -> premier_date) и даты сеансов (class MoviesTimetable -> dates) пересекаются (могут иметь одинаковое значение), значит зачем выводить в 2х разных местах (для премьер и для сеансов) одни и те же даты, если все даты можно запихнуть в 1 таблицу и подключаться к ней через FK (или через m2m. Тут у меня путаница, ведь каждая дата может быть использована любым сеансом, и эта же дата может быть использована, как дата премьеры любого фильма).

- Время для сеансов само по себе имеет иной формат, отличительный от формата DateField и DateTimeField, по этому я его и подумал запихнуть в отдельное поле TimeField. Вообще запихнуть время в отдельную таблицу я решил по той причине, что время сеансов на протяжении года\годов в разных кинотеатрах для разных сеансов повторяется, и предположил “может будет лучше, когда будет сформирована отдельная таблица, в которой будет около 50 вариантов времени для сеансов, и обращаться к этой таблице через FK и не дублировать в таблице расписаний одни и те же времена”.

- Для class Movie -> production_year я думал сделать или IntegerField иди FK и вынести года в отдельную таблицу.

Нормализацию я понял как “убираем дубли из каждой таблицы”. Но после фразы “дата и время уже базовые типы данных, не надо их отдельно выносить в таблицы” я понял, что нормализацию я не так понял. Пошел перечитывать теорию.

Отредактировано TitanFighter (Сен. 24, 2015 17:36:59)

Офлайн

#2 Сен. 25, 2015 20:04:35

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Пару нубских вопросов на тему "Как правильно связать таблицы?"

Для расписания схема, думаю, примерно такая

Все ключи намеренно искусственные. Таблица Show правда довольно хорошо расти будет - пять-шесть сеансов в день, это на один кинотеатр в год ~2000, на сто кинотеатров ~200000 записей в год. Если не устраивает, то как вариант, можно что-то такое

но все становится сильно замороченнее(хотя если сделать естественные первичные ключи, то выглядит чуть приятней) так что я бы остановился на первом варианте.

Раскройте подробнее про даты премьер, внесем и их, далее у вас какой то profit появился, сборы что ли? Вы про них не говорили



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#3 Сен. 25, 2015 21:50:48

TitanFighter
Зарегистрирован: 2015-06-23
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Пару нубских вопросов на тему "Как правильно связать таблицы?"

По поводу Profit - это кассовые сборы, вы верно догадались. Я и сам не знал, что они будут) Первую версию сайта я сделал еще в средине августа, когда вы мне подсказали с полями. Сейчас уже делаю 2ую версию.

По датам премьер все просто - в разных странах разные даты начала показов.
По кассовым сборам аналогично - в разных странах разные сборы и разное к-во посетителей.
Поле weeks из класса Profit думаю исключить и высчитывать исходя из даты премьеры (вроде так гласит правило нормализации - не нужно хранить то, что можно высчитать используя другие данные).

Я думал, куда премьеры включить, или в Show или в Profit (кассовые сборы). Решил в сборы, потому как премьеры зависят от стран, и сами кассовые сборы тоже зависят от стран.

Касательно к-ва сеансов в 1 день в 1 кинотеатре и нагрузки на БД (200 000 сеансов в год при 5-6 сеансах для 100 кинотеатров)…

Только что открыл один кинотеатр - 50 сеансов в день)
В России + Украине кинотеатров 300-400, пускай в среднем по 25 сеансов в каждом. В итоге 7 500-10 000 сеансов в день. За год 2,74 млн - 3,65 млн.
Для баз данных “много” и “тяжело” с каких цифр начинается 100 тыс, 1 млн, 10 млн?)

По поводу вынесения в отдельные таблицы всего чего только можно, вроде наконец разобрался. Вроде теперь понял, что такое нормализация, и понял, что с временем и датой переборщил и не нужно их никуда выносить.

Отредактировано TitanFighter (Сен. 25, 2015 22:40:33)

Офлайн

#4 Сен. 25, 2015 22:53:27

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Пару нубских вопросов на тему "Как правильно связать таблицы?"

Смотрите : премьеры в разных станах в разное время - выносите их в отдельную таблицу ( movie fk, country fk. date ). Аналогично с кассовыми сборами.

Офлайн

#5 Сен. 26, 2015 17:44:33

TitanFighter
Зарегистрирован: 2015-06-23
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Пару нубских вопросов на тему "Как правильно связать таблицы?"

С премьерами и кассовыми сборами понятно. Спасибо.
Подскажите по поводу Сеансов - не могу въехать.
PooH предлагает в Сеансах Date и Time заменить на DateTime.
Я таблицы никогда с нуля не строил, так как не было необходимости. Я только с ними работал на достаточно простом уровне.
Правильно ли я понимаю, что фильтрация по дате и\или по времени в данном случае (DateTime) будет занимать дольше времени и нагружать сильнее базу?
Просто я тут погуглил (1, 2), как правильно из DateTime вытягивать отдельно дату и отдельно время… Есть мнение, что лучше сделать 2 поля Date и Time, чем одно DateTime, по причине большой нагрузки на базу в последнем случае.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version