проектирвоание таблиц

MySQL/PostgreSQL/SQLite/Oracle/M$SQL/....

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

проектирвоание таблиц

Непрочитанное сообщение ProFTP » 2009-12-11 20:06:04

есть таблица:

Код: Выделить всё

CREATE TABLE `video_files` (
  `id_vf` mediumint(9) NOT NULL auto_increment,
  `id_va` mediumint(9) NOT NULL,
  `id_un` mediumint(9) NOT NULL,
  `name_vf` varchar(50) default NULL,
  `description_vf` varchar(600) default NULL,
  `created` int(11) NOT NULL,
  `hidden_vf` tinyint(1) NOT NULL default '0',
  `viewing` int(11) NOT NULL default '0',
  `size_vf` mediumint(9) default NULL,
  `duration` mediumint(9) default NULL,
  `convert_vf` tinyint(1) default '0',
  PRIMARY KEY  (`id_vf`)
);



convert_vf - это конвертированный файл
null, - это положительно, 0 отрицательно

как правило больше будет значени с null

===

тут как бы правильно, сделать еще одну таблицу:
( а в предыдущей таблице удалить convert_vf )

Код: Выделить всё


CREATE TABLE video_files_convert (
  `id_vf`mediumint(9) NOT NULL,
  `convert_vf` tinyint(1) default NULL,
  PRIMARY KEY  (id_vf)
);


CREATE TABLE `video_files` (
  `id_vf` mediumint(9) NOT NULL auto_increment,
...............
  `duration` mediumint(9) default NULL,
  PRIMARY KEY  (`id_vf`)
);

подскажите, с точки зрения правильности, обязательно ли делать 2 таблицы, или можно одну таблицу?

при каких нагрузках или размерах таблиц может быть разница в производительности? (если таблица 200Гиг?)
если это "пофиг", то может лучше сделать одну таблицу?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Gamerman
капитан
Сообщения: 1723
Зарегистрирован: 2009-05-17 21:01:23
Откуда: Украина, Ужгород - Днепр
Контактная информация:

Re: проектирвоание таблиц

Непрочитанное сообщение Gamerman » 2009-12-11 20:15:40

Что-то я не уловил. Связь один к одному? А какие запросы в основном будут?
Глюк глюком вышибают!

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: проектирвоание таблиц

Непрочитанное сообщение ProFTP » 2009-12-11 20:27:07

просто везде в таблице будет стоят convert_vf null

смысл делать строку где почти везде будет одно значение?

а если сделать еще одну таблицу, то там поставить:

convert_vf null
и id через join обядинить

2 возможных значения:
1) null будет положительное
2) а если вообще записи нету, то отрицательное

===

запрос WHERE convert_vf != 0

===
я бы хотел спросить с точки зрений праивльности, я затрудняюсь выбрать правильный вариант... (если разница нету - то значит оба правильные)
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
Gamerman
капитан
Сообщения: 1723
Зарегистрирован: 2009-05-17 21:01:23
Откуда: Украина, Ужгород - Днепр
Контактная информация:

Re: проектирвоание таблиц

Непрочитанное сообщение Gamerman » 2009-12-11 20:53:37

Насколько я знаю Мускуль очень хорошо работает с НУЛ-значеними. Я бы делал все в одной таблице. Потому, что если будет связь, то это будут еще и индексы, не знаю, получиться ли экономия.
Глюк глюком вышибают!

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: проектирвоание таблиц

Непрочитанное сообщение ProFTP » 2009-12-11 20:58:27

мне один человек рассказывал, говорил что лучше делать 2 таблицы... будут какие дырки в хранилище :)
(наверное про MyISAM такое)

а запрос можно без join, а просто по id сравнить с двух таблц

ок, сделаю тогда 1 таблицу...

там навреное надо тестирвоать в любом случае, а если таблица будет 200гиг, то тогда отказатся от MySQL вообще :)
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
Gamerman
капитан
Сообщения: 1723
Зарегистрирован: 2009-05-17 21:01:23
Откуда: Украина, Ужгород - Днепр
Контактная информация:

Re: проектирвоание таблиц

Непрочитанное сообщение Gamerman » 2009-12-11 21:08:19

Тип хранения таблиц какой планируется?
Глюк глюком вышибают!

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: проектирвоание таблиц

Непрочитанное сообщение ProFTP » 2009-12-11 22:10:14

MyISAM
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
Gamerman
капитан
Сообщения: 1723
Зарегистрирован: 2009-05-17 21:01:23
Откуда: Украина, Ужгород - Днепр
Контактная информация:

Re: проектирвоание таблиц

Непрочитанное сообщение Gamerman » 2009-12-11 22:38:01

А запросы какие предполагаются? Если сначала только
с таблицы video_files_convert (
`id_vf`mediumint(9) NOT NULL,
`convert_vf` tinyint(1) default NULL,
PRIMARY KEY (id_vf)
);
а потом уже остальную инфу, то возможно, что 2 таблицы все же будет лучше.
Глюк глюком вышибают!

Аватара пользователя
goshanecr
сержант
Сообщения: 252
Зарегистрирован: 2008-03-31 15:54:49
Откуда: Пермь, Екатеринбург
Контактная информация:

Re: проектирвоание таблиц

Непрочитанное сообщение goshanecr » 2009-12-19 19:40:35

Я предлагаю избавиться от varchar'ов. С ними работает медленней, да и вроде как MyISAM собирается товарищ использовать, а там какие-то фрагментации таблиц начинаются с варчарами.. Ну и id_va и id_un предлагаю сделать индексами.
Люблю в инете шарить. И браузер мой только Opera !!!
Пользователям стараюсь ставить дистр Ubuntu. Уже 3 человека пересели.
Домашний комп FreeBSD 9.0 amd64
FreeBSD - изменим жизнь к лучшему!

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: проектирвоание таблиц

Непрочитанное сообщение zg » 2009-12-19 21:16:06

goshanecr писал(а):С ними работает медленней, да и вроде как MyISAM собирается товарищ использовать, а там какие-то фрагментации таблиц начинаются с варчарами..
это не спасёт, если база криво сделана. Фрагметнации - это проблемы муси и файловой системы, база должна быть спроектирована правильно, тогда будет толк.
ProFTP писал(а):подскажите, с точки зрения правильности, обязательно ли делать 2 таблицы, или можно одну таблицу?
с точки зрения правильности только тип связи "один-к-одноиу" можно запихнуть в одну таблицу. Если тип "один-ко-многим" или "многие-ко-многим", то только две таблицы.
Gamerman писал(а):Насколько я знаю Мускуль очень хорошо работает с НУЛ-значеними.
его не рекомендуют использовать без надобности, поскольку это дополнительная нагрузка, особенно в индексах. Для булева типа нужно использовать TINYINT(1) NOT NULL и не иначе.
ProFTP писал(а):null, - это положительно, 0 отрицательно
самое неправильное решение, которое тут можно только придумать.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: проектирвоание таблиц

Непрочитанное сообщение ProFTP » 2009-12-20 9:01:11

goshanecr писал(а):Я предлагаю избавиться от varchar'ов. С ними работает медленней, да и вроде как MyISAM собирается товарищ использовать, а там какие-то фрагментации таблиц начинаются с варчарами.. Ну и id_va и id_un предлагаю сделать индексами.
а так достаточно PRIMARY KEY (id_vf, id_va,id_un ) как раз и уникальность и индекс будет, правильно?
zg писал(а):самое неправильное решение, которое тут можно только придумать.
я сделал так: 0 и 1

но например мне говорили:
(я не отрицаю и не поддерживаю)

1) есть например, 1 - будет больше чем 0 в поле ro

то можно сделать еще одну таблицу и туда написать id, ro

при этом ro будет как NULL

если запись есть IS NULL - то это положительное, а если нету, то отрицательное


2) еще варинта, и этот вариант я видел в движке SMF (сильно не интересовался)

где NULL - это один полюс
а 0 - это другой полюс

при запросе SECELET IFNULL(t1.ro,1) это означает, что NULL будет как 1

NULL в идексах не участвует, возможно оно будет быстрее? но не обязательно
и по-моиму NULL это 1 бит ровно, а 1 и 0 ит.д. это от 6-10 бит

===

на я так понял что это фигня на счет 0 1 NULL, фиг с ним, короче :smile:
Последний раз редактировалось ProFTP 2009-12-21 4:11:40, всего редактировалось 2 раза.
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
goshanecr
сержант
Сообщения: 252
Зарегистрирован: 2008-03-31 15:54:49
Откуда: Пермь, Екатеринбург
Контактная информация:

Re: проектирвоание таблиц

Непрочитанное сообщение goshanecr » 2009-12-20 9:17:52

а так достаточно PRIMARY KEY (id_vf, id_va,id_un ) как раз и уникальность и индекс будет, правильно?
Судя по названиям полей id_va, id_un - они являются идентификаторами чего-то там, что хранится в другой таблице... Если это так, то лучше всё таки по отдельности сделать их индексами, а id_vf - Primary key.
Люблю в инете шарить. И браузер мой только Opera !!!
Пользователям стараюсь ставить дистр Ubuntu. Уже 3 человека пересели.
Домашний комп FreeBSD 9.0 amd64
FreeBSD - изменим жизнь к лучшему!

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: проектирвоание таблиц

Непрочитанное сообщение ProFTP » 2009-12-20 9:20:25

goshanecr писал(а):
а так достаточно PRIMARY KEY (id_vf, id_va,id_un ) как раз и уникальность и индекс будет, правильно?
Судя по названиям полей id_va, id_un - они являются идентификаторами чего-то там, что хранится в другой таблице... Если это так, то лучше всё таки по отдельности сделать их индексами, а id_vf - Primary key.
а если у меня эти 3 поля должны быть уникальными

то можо так KEY unik ( id_vf, id_va,id_un ) ?

unik - это будет имя ограничения уникальности имя ограничения уникальности
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
goshanecr
сержант
Сообщения: 252
Зарегистрирован: 2008-03-31 15:54:49
Откуда: Пермь, Екатеринбург
Контактная информация:

Re: проектирование таблиц

Непрочитанное сообщение goshanecr » 2009-12-20 9:42:08

а зачем нужны 3 числовых поля, да ещё и чтобы все три были уникальными? В данном случае, с базой видеофильмов, какой в них закладывается смысл?
Люблю в инете шарить. И браузер мой только Opera !!!
Пользователям стараюсь ставить дистр Ubuntu. Уже 3 человека пересели.
Домашний комп FreeBSD 9.0 amd64
FreeBSD - изменим жизнь к лучшему!

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: проектирвоание таблиц

Непрочитанное сообщение ProFTP » 2009-12-20 9:58:24

я имею ввиду что все 3 вместе должны быть уникальными

чтобы НЕ было так
1 2 3
1 2 3

чтобы можно было

1 2 3
2 2 3
3 1 3

для этого KEY unik ( id_vf, id_va,id_un ) ?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение