adsl club

Справочник

Форум

Программы

Фильмы

Ресурсы

Файлообмен

Хостинг

Ростелеком
структура БД и вложенных таблиц
На страницу 1 2
Ответить на тему    Форум АДСЛ КлубаЦИФРОВОЙ ФЛЕЙМ :)ПРОГРАММИРОВАНИЕ
Автор Сообщение
leoboec
Эксперт
СообщениеДобавлено: Пн 24-05-10 : 18-06    Заголовок сообщения: структура БД и вложенных таблиц Ответить с цитатой

в общем вопрос касается MySQL надо сделать несколько таблиц связав их между собой (так как я в sql новичек нужна Ваша помощь) онимаю что вроде по первичному ключу.. связь.. но все равно точно понять не могу.... собственно жду подсказок Smile связь таблиц примерно так как на прикрепленном рисунке


бд.JPG
 Описание:  
 Размер файла:  24.74 KB
 Просмотрено:  254 раз(а)

бд.JPG

 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
Richard Ferlow
Гуру
Предупреждений : 2
СообщениеДобавлено: Пн 24-05-10 : 18-13    Заголовок сообщения: Ответить с цитатой

Создаешь таблицу где поле ID autoincrement, и еще есть поле ParentID помимо Name и прочего.

Ну дальше просто -

Главные категории будут с ParentID 0

Вложенные будут ParentID иметь согласно тому какой категории принадлежат.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
leoboec
Эксперт
СообщениеДобавлено: Пн 24-05-10 : 18-25    Заголовок сообщения: Ответить с цитатой

ага вот про автоинкримент я как раз подумал.. потому что с ним прикольно вроде получается... так и я так понимаю что автоинкримент для каждой таблицы надо содавать.. типа нумерация внутри таблиц.. про ParentID суть понял... но можно немного поконкретнее ?? то есть это тоже ID для связи именно таблиц между родительскими и дочерними?!

и сразу следующий вопрос возникает... скажем я работаю с этой БД на локальном компьютере и есть точно такая же на серваке... вот проблема синхронизации.. как мне проверять и тем более заливать на сервер новы/измененные строки.. получается если таблица скажем 100000 строк то время оэидания будет большое.. можно ли как то такое реализовать, чтобы проссматривать только измененные на локальном компьютере (скажем я думал о дополнительном поле что-то типа дата изменения..)
заранее благодарен
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
Richard Ferlow
Гуру
Предупреждений : 2
СообщениеДобавлено: Пн 24-05-10 : 18-40    Заголовок сообщения: Ответить с цитатой

...да вроде 100к не так уж много =) не сделаете дамп архивом и выгрузите.

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

А так посмотрите SypexDumper - большие дампы там не проблема, я бы ей делал при случае....



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

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

ParentID вручную будете добавлять.

например

Бытовая тахника - ID - 1 Parentid - 0
Телефония - ID 2 - Parentid - 0


ТВ - ID 3 - ParentID 1

LCD - ParentID - 3
Обычные - ParentID - 3

и т.д. -
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
leoboec
Эксперт
СообщениеДобавлено: Пн 24-05-10 : 18-45    Заголовок сообщения: Ответить с цитатой

эм... нет нет Smile) на моем рисунке как раз не однеа таблица Smile)) то есть есть общая таблица основная а есть таблица она как бы не вложенная.. она связана просто с первой таблицей (то есть конкретно с ячейкой ТВ) далее у таблицы о ТВ есть своя таблица.. (они все раздельны!!! это не одна таблица) может это и глупо Smile но сейчас проект требует именно таких действий Smile

зы.. пардон случайно так вставилос
Последний раз редактировалось: leoboec (Пн 24-05-10 : 18-48), всего редактировалось 1 раз
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
leoboec
Эксперт
СообщениеДобавлено: Пн 24-05-10 : 18-47    Заголовок сообщения: Ответить с цитатой

Richard Ferlow писал(а):
...да вроде 100к не так уж много =) не сделаете дамп архивом и выгрузите.

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

А так посмотрите SypexDumper - большие дампы там не проблема, я бы ей делал при случае....



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


эм... нет нет Smile) на моем рисунке как раз не однеа таблица Smile)) то есть есть общая таблица основная а есть таблица она как бы не вложенная.. она связана просто с первой таблицей (то есть конкретно с ячейкой ТВ) далее у таблицы о ТВ есть своя таблица.. (они все раздельны!!! это не одна таблица) может это и глупо Smile но сейчас проект требует именно таких действий Smile



Richard Ferlow писал(а):
Смотря сколько у вас товаров, если прям огроменное кол-во будет, то имеет смысл структура пунктов хранить в одной таблице, а сами товары уже в другой, так проще будет.

ParentID вручную будете добавлять.

например

Бытовая тахника - ID - 1 Parentid - 0
Телефония - ID 2 - Parentid - 0


ТВ - ID 3 - ParentID 1

LCD - ParentID - 3
Обычные - ParentID - 3

и т.д. -

да тут даже дело не в количестве товара а в том что НАДО сейчас так сделать Smile))
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
Richard Ferlow
Гуру
Предупреждений : 2
СообщениеДобавлено: Пн 24-05-10 : 18-49    Заголовок сообщения: Ответить с цитатой

leoboec
...эм...мне кажется, вы ошибаетесь с таким подходом Smile

Ну в любом случае через ParentID у вас связь...но при этом где-то надо будет хранить даннные какая таблица какой принадлежит, что в прямом пути - в таблице ТВ какие таблицы лежат, что и в обратном - Конкретный товар каким таблицам принадлежит(полный путь имеется ввиду)
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
leoboec
Эксперт
СообщениеДобавлено: Пн 24-05-10 : 18-57    Заголовок сообщения: Ответить с цитатой

да понятно, что ошибаюсь Smile но просто идей на другие таблицы не хватает Smile то есть я правильно понимаю:
Таблица Бытовая техника сотоит скажем ТВ(ключ1) микроволновка и тд
далее таблица ТВ состоит из столбцов lcd обычны и тд (сама таблица должна быть связана с первой по ключу 1 но при этом у нее должен быть ключ2 который связывает ее с 3 таблицей) и так для всех вложенных таблиц?!
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
Richard Ferlow
Гуру
Предупреждений : 2
СообщениеДобавлено: Пн 24-05-10 : 19-02    Заголовок сообщения: Ответить с цитатой



Вот такую структуру можно в пределах одной таблицы реализовать через ID и ParentID

как вы предлагаете - так стоит делать только если четко понимаете, зачем вам нужно именно так.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
leoboec
Эксперт
СообщениеДобавлено: Пн 24-05-10 : 19-06    Заголовок сообщения: Ответить с цитатой

мне нужно именно так для проекта, чтобы защитить диплом, никуда далее этот проект не пойдет... в проекте должно быть несколько таблиц около 10.. вот я и придумал сделать вот такое разделение... потому что другого не могу придумать... Sad к сожалению
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
Richard Ferlow
Гуру
Предупреждений : 2
СообщениеДобавлено: Пн 24-05-10 : 19-22    Заголовок сообщения: Ответить с цитатой

Сразу бы сказали так =)

ну я так вроде бы все объяснил =)
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
leoboec
Эксперт
СообщениеДобавлено: Пн 24-05-10 : 19-34    Заголовок сообщения: Ответить с цитатой

ага спасибо большое Smile)) буду сегдоня пытаться структуру эту всю воссоздать Smile если что еще сюда отпишусь.. но суть я уловил правильно?? что типа у каждой таблицы получается есть два ключа пок оторым она связана с предыдущей (родительской) и дочерней?! верно?!
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
AlexRock
Гуру
СообщениеДобавлено: Пн 24-05-10 : 20-02    Заголовок сообщения: Ответить с цитатой

leoboec писал(а):
вот проблема синхронизации

Эмм, я как бы тоже сейчас этим занимаюсь. Я решил просто скопировать модель синхронизации с той, что WCF предлагает. Т. е. для каждой таблицы твоей БД заводится ещё по паре столбцов ("Время последнего редактирования" и "Время добавления") и по одной таблице для хранения удалённых записей (ибо как ты будешь синхронизировать те данные, которые на сервере уже удалены? - клент-то о них не узнает уже). Таблица хранения удалёнок состоит из идентификатора удалённой записи и времени её удаления.

Синхронизация просиходит так: сначала выбираются удалёнки из таблиц удалёнок, потом выбираются вставки по столбцам "Время добалвения" (сравнивается время последней синхронизации клиента и "Время добавления" для каждой записи), потом выбираются изменёнки по столбцу "Время последнего редактирования" (опять по времени синхронизации клиента сравнение). Как-то так. Подробнее можно глянуть тут. СУБД не важна тут - главное, принцип.

Там же про пакетирование можно почитать, чтобы твои транзакции на сотни и тысячи записей с большими объёмами данных (картинки, большие тексты и пр.) не потерялись и не стали жертвой недостатка памяти.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
leoboec
Эксперт
СообщениеДобавлено: Чт 27-05-10 : 17-43    Заголовок сообщения: Ответить с цитатой

ага а можно про таблицу удаленок поподробнее???? для каждой таблицы я создаю дополнительную таблицу в которой содержатсья удаленные элементы??? и соответственно вопрос... скажем если я в главной таблице удаляю строку следовательно мне нужно удалить и все записи из подчиненных таблиц... и получается для каждого уровня будут свои таблицы из которых последовательно все и удаляется??? или как?
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
AlexRock
Гуру
СообщениеДобавлено: Чт 27-05-10 : 17-57    Заголовок сообщения: Ответить с цитатой

AlexRock писал(а):
потом выбираются вставки по столбцам "Время добалвения" (сравнивается время последней синхронизации клиента и "Время добавления" для каждой записи), потом выбираются изменёнки по столбцу "Время последнего редактирования" (опять по времени синхронизации клиента сравнение)

Кстати, если при добавлении записи в таблицу заполнять каким-нибудь скриптом или триггером (чего там у вас с СУБД есть) столбец "Время последнего редактирования" тем же значением, что и в "Время добавления", то фактически при синхронизации с сервера можно не запрашивать столбец "Время добавления", ибо это будут те же данные, что и в столбце "Время последнего редактирования", т. е. всего два запроса придётся сделать - по столбцу изменений, и по столбцу удалений (в таблице удалёнок), вместо запросов по трём столбцам. Я сейчас так написал код, только ещё не протестировал. ))
leoboec писал(а):
для каждой таблицы я создаю дополнительную таблицу в которой содержатсья удаленные элементы??? и соответственно вопрос... скажем если я в главной таблице удаляю строку следовательно мне нужно удалить и все записи из подчиненных таблиц... и получается для каждого уровня будут свои таблицы из которых последовательно все и удаляется??? или как?

Угу. Если сделать триггеры, то всё будет удаляться автоматом - в таблицах связей будут удаляться по правилам удаления при создании связей (у меня это в мастере создания таблиц выбирается), а в таблицах удалёнок - по триггерам удаления. Только я пользуюсь уже готовой такой реализацией от WCF - у меня в первоначальной БД мастер сам создаёт для каждой таблицы эти дополнительные столбцы и таблицу удалёнок и добавляет к ним триггеры. Например, для таблицы Table1 в базе данных dbpic2008 есть триггер, который заполняет талбицу удалёнок (Table1_Tombstone) после каждого удаления записи из таблицы Table1:





Здесь используется СУБД MS SQL Server 2008 Express, а триггер написан на Transact-SQL.

Это всего лишь один из вариантов реализации. Я сначала думал, что данные об удалении записей можно помещать в исходную же таблицу Table1, но потом решил не заморачиваться и просто передрать уже готовый вариант, предложенный Microsoft.
Последний раз редактировалось: AlexRock (Чт 27-05-10 : 18-04), всего редактировалось 1 раз
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
leoboec
Эксперт
СообщениеДобавлено: Чт 27-05-10 : 18-03    Заголовок сообщения: Ответить с цитатой

да и еще вопрос... столбцы дата создания и дата редактирования по идее можно же сделать невидимыми??? они же нужны только для программы.. пользователю видеть их не надо? верно я думаю?
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
AlexRock
Гуру
СообщениеДобавлено: Чт 27-05-10 : 18-07    Заголовок сообщения: Ответить с цитатой

leoboec писал(а):
да и еще вопрос... столбцы дата создания и дата редактирования по идее можно же сделать невидимыми??? они же нужны только для программы.. пользователю видеть их не надо? верно я думаю?

Хмм, а первоначально вообще БД пользователю не видна - что ты из БД считаешь и покажешь пользователю, то и будет видно. Ты, наверное, имеешь ввиду, когда с помощью внутренних механизмов среды программирования тебе готовую таблицу с данными (dataGrid, например) создают по таблице из БД. В Вижуале можно в мастере выбрать, какие столбцы отображать, а если руками делать такие датагриды, то сам назначаешь его состав.

Прямо в самой БД делать невидимые столбцы смысла нет, ибо зачем это?
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
leoboec
Эксперт
СообщениеДобавлено: Чт 27-05-10 : 18-10    Заголовок сообщения: Ответить с цитатой

да и еще разок про ключи точнее про Parrent 0 1 и так далее.. можно уточнение... итак первая таблица бытовая техника у нее есть общий ключ который связывает ее с вложенными таблицами второго уровня?? у таблиц второго уровня есть свои ключи которые связывают из с таблицами третьего уровня?? верно я понимаю??? и может ли этим ключом быть автоинкримент??? по идее уникальный номер?!
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
leoboec
Эксперт
СообщениеДобавлено: Чт 27-05-10 : 18-13    Заголовок сообщения: Ответить с цитатой

AlexRock писал(а):
leoboec писал(а):
да и еще вопрос... столбцы дата создания и дата редактирования по идее можно же сделать невидимыми??? они же нужны только для программы.. пользователю видеть их не надо? верно я думаю?

Хмм, а первоначально вообще БД пользователю не видна - что ты из БД считаешь и покажешь пользователю, то и будет видно. Ты, наверное, имеешь ввиду, когда с помощью внутренних механизмов среды программирования тебе готовую таблицу с данными (dataGrid, например) создают по таблице из БД. В Вижуале можно в мастере выбрать, какие столбцы отображать, а если руками делать такие датагриды, то сам назначаешь его состав.

Прямо в самой БД делать невидимые столбцы смысла нет, ибо зачем это?


ну как бы да Smile я примерно это и имел ввиду Smile)) хотя может быть и не это.. суть проекта в общем такая... у меня есть какая то БД состоящая скажем из 10 таблиц.. и точно такая же бд есть на сервере с такими же таблицами.. то есть пользователь видит сами таблицы.. но у меня же таблицы (так как есть синхронизация ) содержат столбцы дата создания и дата редактирования... но эти столбцы даром не нужны пользователю! то есть он их видеть не должен... соответственно я их сходу ставлю visible= false и не напрягаюсь.. верно?
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
AlexRock
Гуру
СообщениеДобавлено: Чт 27-05-10 : 18-29    Заголовок сообщения: Ответить с цитатой

leoboec писал(а):
да и еще разок про ключи точнее про Parrent 0 1 и так далее.

Richard Ferlow писал(а):
и еще есть поле ParentID помимо Name и прочего.



Ну дальше просто -



Главные категории будут с ParentID 0



Вложенные будут ParentID иметь согласно тому какой категории принадлежат.

А я не понял, зачем Ричард вообще предложил пэаранты делать? Разве что для явного обозначения иерархичской классификации бытовой техники? Можно просто связать таблицы обычными отношениями родитель-потомок (а в этих отношениях прописать правила удаления-редактирования), а эта иерархия будет прослеживаться косвенно, а не явно через лишние данные в виде ПэарантАйди0 и т. д.

У меня всё сделано вот через такие отношения:




Вот так у меня создаются отношения - тут видно, что для отображения иерархии не нужны дополнительные поля типа ПэарантАйди и т. п. - всё делается через первичные и внешние ключи (тут в окне данные по умолчанию при открытии окна создания нового отношения - поэтому не совпадают с данными на рисунке сверху):




Если сильно надо, можешь нарисовать себе на листочке схемы БД, где эту иерархию можешь отобразить стрелками со связями и расположив таблицы на разном уровне - для СУБД это не будет иметь никакого значения, ей только отношения (relations) важны.
Последний раз редактировалось: AlexRock (Чт 27-05-10 : 18-36), всего редактировалось 1 раз
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
Показать сообщения:   
Ответить на тему    Форум АДСЛ КлубаЦИФРОВОЙ ФЛЕЙМ :)ПРОГРАММИРОВАНИЕ Часовой пояс: GMT + 7
На страницу 1 2
Страница 1 из 2

 

 
Аватары: Вкл|Выкл   ЮзерИнфо: Вкл|Выкл   Подписи: Вкл|Выкл
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы можете скачивать файлы