Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разбиение одной таблицы на несколько 
:(
    Опции темы
СтудентИзРоссии
  Дата 4.2.2007, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 13.11.2006

Репутация: нет
Всего: нет



Добрый день!

Есть таблица users.

Три столбца:
name (имя), age (возраст), city (город)

Таблица маленькая, но проблема вот в чём, как лучше организовать столбцы,
помимо этих трёх добавятся ещё порядка 50 (а потом ещё 200), в ширину таблица получится огромная,
стоит ли её разбивать на несколько? Если да, то есть ли какой-либо стандарт для решения этой задачи?
PM MAIL   Вверх
everyone
Дата 4.2.2007, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 24.3.2004

Репутация: нет
Всего: 4



Стандарт?)
Проектирование здесь зависит от данных, которые будут добавляться... Может быть потребуются связи с другими таблицами.
Но разбивать как-то указанные данные, я не вижу смысла, и если все остальные имеют такой же характер, то почему бы просто не увиличивать степень отношения..
Но если появится другой объект, то просто следует создать для него таблицу и поразмыслить над её связью с уже существующим.
--------------------
Что написал, то написал (Пилат)
PM ICQ Skype   Вверх
Rodman
Дата 4.2.2007, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: нет
Всего: 122



Цитата(СтудентИзРоссии @  4.2.2007,  17:30 Найти цитируемый пост)
помимо этих трёх добавятся ещё порядка 50 (а потом ещё 200)

что и как ты хочешь добалять, а главное зачем???

базы данных нужны для "правильного" хранения данных... а ты, как я понял, хочешь все данные в одну таблицу....
PM MAIL WWW Skype GTalk YIM MSN   Вверх
muzer
Дата 5.2.2007, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 31.8.2006

Репутация: 30
Всего: 31



Цитата(СтудентИзРоссии @  4.2.2007,  19:30 Найти цитируемый пост)
Если да, то есть ли какой-либо стандарт для решения этой задачи?

Есть, называется - нормальные формы.
PM WWW   Вверх
СтудентИзРоссии
  Дата 5.2.2007, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 13.11.2006

Репутация: нет
Всего: нет



Цитата(everyone @ 4.2.2007,  19:52)
Стандарт?)
Проектирование здесь зависит от данных, которые будут добавляться... Может быть потребуются связи с другими таблицами.
Но разбивать как-то указанные данные, я не вижу смысла, и если все остальные имеют такой же характер, то почему бы просто не увиличивать степень отношения..
Но если появится другой объект, то просто следует создать для него таблицу и поразмыслить над её связью с уже существующим.


Цитата(Rodman @ 4.2.2007,  20:44)
Цитата(СтудентИзРоссии @  4.2.2007,  17:30 Найти цитируемый пост)
помимо этих трёх добавятся ещё порядка 50 (а потом ещё 200)

что и как ты хочешь добалять, а главное зачем???

базы данных нужны для "правильного" хранения данных... а ты, как я понял, хочешь все данные в одну таблицу....


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

Код

users
-----
name
-----

parameters
----------
name (parameters.name = users.name)
columnname (пр1.: age; пр2.: city)
columnvalue (пр1.: 30; пр2.: Вашингтон)
----------


Таким образом можно будет хоть 1000000 дополнительных полей для каждого пользователя сделать,
правильный ли этот подход? Связь будет users.name = parameters.name

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

Цитата(muzer @ 5.2.2007,  02:09)
Цитата(СтудентИзРоссии @  4.2.2007,  19:30 Найти цитируемый пост)
Если да, то есть ли какой-либо стандарт для решения этой задачи?

Есть, называется - нормальные формы.


Спасибо за подсказку, почитаем.
PM MAIL   Вверх
muzer
Дата 5.2.2007, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 31.8.2006

Репутация: 30
Всего: 31



Цитата(СтудентИзРоссии @  5.2.2007,  08:46 Найти цитируемый пост)
правильный ли этот подход? Связь будет users.name = parameters.name

Неправильный. Связь лучше с точки зрения производительности базы данных и неизбыточности данных осуществлять по целочисленному уникальному ключу.

Что же касается идеи использовать таблицу parameters:
опять же либо поле columnname должно быть типа enum, но тогда нужно будет алтерить таблицу при каждом добавлении нового поля, либо columnname - должен быть идентификатором (columnname_id), указывающим на уникальный ключ в словарике-таблице из двух полей columnname_id | columnname.


Цитата(СтудентИзРоссии @  5.2.2007,  08:46 Найти цитируемый пост)
Таким образом можно будет хоть 1000000 дополнительных полей для каждого пользователя сделать

Увы, не всё так просто. Возможности MySQL по работе с большими таблицами ограничены.
Из своего опыта: на мощнейших серверах работа с таблицами > 100 млн записей становится сложной. Из таблицы в четверть миллиона зписей для сервиса в реальном времени выбрать что-либо даже по ключу уже невозможно, такие таблицы годятся только для фоновых процессов. Таблицу больше 1 млрд строк можно сгенерить, но с ней работать уже скучно даже в фоне.
PM WWW   Вверх
СтудентИзРоссии
  Дата 5.2.2007, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 13.11.2006

Репутация: нет
Всего: нет



Цитата(muzer @ 5.2.2007,  08:40)
Цитата(СтудентИзРоссии @  5.2.2007,  08:46 Найти цитируемый пост)
правильный ли этот подход? Связь будет users.name = parameters.name

Неправильный. Связь лучше с точки зрения производительности базы данных и неизбыточности данных осуществлять по целочисленному уникальному ключу.


name int unsigned auto_increment primary key

Цитата(muzer @ 5.2.2007,  08:40)
Что же касается идеи использовать таблицу parameters:
опять же либо поле columnname должно быть типа enum, но тогда нужно будет алтерить таблицу при каждом добавлении нового поля, либо columnname - должен быть идентификатором (columnname_id), указывающим на уникальный ключ в словарике-таблице из двух полей columnname_id | columnname.


Подход к решению задачи по Вашим словам - правильным.
Везде будет использоваться ключевое слово id (nameid, ...) (primary key).

Тип enum автоматически отпадает, использовать его неудобно,
планируем использовать несколько типов данных для parameters (varchar, timestamp, int).
Т.е. есть анкета, в ней немеренно вопросов, некоторые ответы подпадают под тип VARCHAR,
другие под SMALLINT(3), другие под TIMESTAMP(14), хранить их все в VARCHAR - не целесообразно.

Цитата(muzer @ 5.2.2007,  08:40)
Цитата(СтудентИзРоссии @  5.2.2007,  08:46 Найти цитируемый пост)
Таким образом можно будет хоть 1000000 дополнительных полей для каждого пользователя сделать

Увы, не всё так просто. Возможности MySQL по работе с большими таблицами ограничены.
Из своего опыта: на мощнейших серверах работа с таблицами > 100 млн записей становится сложной. Из таблицы в четверть миллиона зписей для сервиса в реальном времени выбрать что-либо даже по ключу уже невозможно, такие таблицы годятся только для фоновых процессов. Таблицу больше 1 млрд строк можно сгенерить, но с ней работать уже скучно даже в фоне.


Вы правы, не всё так просто, потому и пытаемся разбить всё на несколько таблиц, которые выглядели бы
оптимальней, чем одна большая таблица с сотнями столбцов.
PM MAIL   Вверх
SergeBS
Дата 5.2.2007, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 2
Всего: 22



muzer, 
Цитата
Таблицу больше 1 млрд строк можно сгенерить, но с ней работать уже скучно даже в фоне. 

Если думаешь, что это только у MySQL такие проблемы, то зря. Прошвырнись по соседним серверам - все примерно так же.
СтудентИзРоссии, 
Цитата
Тип enum автоматически отпадает, использовать его неудобно,

DelphiKingdon или местный FAQ - Тенцер "Естественные ключи против искусственных ключей". И вообще "удобно-неудобно" - не те термины. Куче обормотов удобно фамилию, имя, отчество в одно поле забивать, например. А по уму за такое сразу увольнять надо без выходного пособия.

Добавлено @ 12:10 
Пардон, опечатка. DelphiKingdoM (а не n)
PM MAIL   Вверх
СтудентИзРоссии
  Дата 5.2.2007, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 13.11.2006

Репутация: нет
Всего: нет



Цитата(SergeBS @ 5.2.2007,  12:08)
muzer, 
Цитата
Таблицу больше 1 млрд строк можно сгенерить, но с ней работать уже скучно даже в фоне. 

Если думаешь, что это только у MySQL такие проблемы, то зря. Прошвырнись по соседним серверам - все примерно так же.
СтудентИзРоссии, 
Цитата
Тип enum автоматически отпадает, использовать его неудобно,

DelphiKingdon или местный FAQ - Тенцер "Естественные ключи против искусственных ключей". И вообще "удобно-неудобно" - не те термины. Куче обормотов удобно фамилию, имя, отчество в одно поле забивать, например. А по уму за такое сразу увольнять надо без выходного пособия.

Добавлено @ 12:10 
Пардон, опечатка. DelphiKingdoM (а не n)

Может быть Вы и правы, но именно по нашей теме можете что-нибудь посоветовать? 
PM MAIL   Вверх
skyboy
Дата 5.2.2007, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



можем. три таблицы. отдельно - люди:
men
idman int unsigned auto_increment
name varchar(80)
отдельно - параметры
params
idparam int unsigned auto_increment
name varchar(80)
отдельно - значения параметров для разных людей:
men_params
idman unsigned int
idparam unsigned int
value varchar(60)
primary key(idman, idparam)
тогда будь хоть 2000 параметров - просто в таблице params будет 200 записей. но не полей.
это, кстати, и есть нормальная форма(одна из), ссылку на инфо о которых давал muzer ещё ночью smile
PM MAIL   Вверх
СтудентИзРоссии
  Дата 5.2.2007, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 13.11.2006

Репутация: нет
Всего: нет



Цитата(skyboy @ 5.2.2007,  12:55)
можем. три таблицы. отдельно - люди:
men
idman int unsigned auto_increment
name varchar(80)
отдельно - параметры
params
idparam int unsigned auto_increment
name varchar(80)
отдельно - значения параметров для разных людей:
men_params
idman unsigned int
idparam unsigned int
value varchar(60)
primary key(idman, idparam)
тогда будь хоть 2000 параметров - просто в таблице params будет 200 записей. но не полей.
это, кстати, и есть нормальная форма(одна из), ссылку на инфо о которых давал muzer ещё ночью smile

Благодарим за пример!

Про нормальные записи уже начали читать.
PM MAIL   Вверх
skyboy
Дата 5.2.2007, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(СтудентИзРоссии @  5.2.2007,  12:28 Найти цитируемый пост)
Про нормальные записи

нормальные формы smile
однако, НФ - это не панацея. все сильно зависит от задачи. порою стОит хранить ФИО в одном поле и делать де-нормализованные таблицы. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0577 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.