|
|
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
Задача вроде бы очень простая. Есть некоторое количество таблиц каждая со своей структурой среди которых таблица с именем, например image и полями для краткости изложения: id int auto_increment, filename varchar(255). Задача снабдить ряд таблиц ссылкой на изображение решается тривиально через добавление поля image_id. Сделали запрос - получили по указателю имя файла. Но как-то все не сшивается если захотеть получать изображения. Сначала все тоже вроде просто. Выкидываем из таблиц поле image_id, заводим таблицу image_list куда оно и переезжает в паре с указателем на родителя: (int id auto_increment, int parent_id, int image_id). Теперь можно связать с любой таблицей любое количество изображений. Но проблема в том, что parent_id в БД состоящей из более чем 1 таблицы не уникален. Дубовые решения как то 1) специфически размножать таблицу image_list для каждой нуждающейся в изображениях таблицы; 2) завести некий глобальный ID типа UUID; 3) завести процедуру генерации глобального ID - грозят геморроем в будущем. Легко приходит на ум программистское решение передать в запрос имя таблицы, типа добавить this . Но тогда придется либо сохранять в каждой записи имя родительской таблицы, либо заводить еще таблицу с парочкой ID - имя таблицы. В information_schema я ничего подходящего в таблице TABLES не нашел. Может быть не там искал или вообще все не так делается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 06:46:28 |
|
||
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
debloggerТеперь можно связать с любой таблицей любое количество изображений.Я не понял, разве вариант с image_id в каждой таблице не позволяет "связать с любой таблицей любое количество изображений"? Или имелось в виду "связать с каждой записью любое количество изображений"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 06:57:26 |
|
||
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
deblogger, :) опишите задачу строже: "имеем это" (с приведением DDL), "хотим это" (с приведением образца результата), "пробуем так - получаем не то что хотелось" (с указанием чего конкретно не то - скорость получения, содержание и т.д.) ... потому как первый абзац содержит вполне вменяемое описание работающего варианта... а вот чего хотелось дальше - нестируктурированный поток мысли. По-просту, непонятна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 06:58:46 |
|
||
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
Arhat109, Начните прямо с первого предложения второго абзаца: что значит "захотеть получать изображения" ? В первом абзаце - это процесс вообще-то и описан, ежели вчё. Нет? А по полученному имени файла - прочитать файл не получается или как? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 07:00:45 |
|
||
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
Arhat109, мой ХШ подозревает, что ТСу хочется M:M между записями таблиц и файлами. Вот он и думает: -то ли для каждой таблицы заводить связку %tablename%2images -то ли сделать одну общую таблицу связи... --и либо делать в ней некий указатель на исходную таблицу --либо вообще перейти на глобальное использование гуидов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 07:04:53 |
|
||
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
При установлении связи сверху-вниз можно получить ровно 1 штуку. При установлении снизу-вверх - любое количество штук. Я понимаю что ID таблицы в сущности ее имя. Но как-то неправильно хранить кучу юникодовых байтов в каждой записи моста отчего и пришла такая идея заменить эту кучу четырьмя int unsigned. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 07:05:02 |
|
||
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
В парадигме программирования эта задача решается в один счет введением смещения адреса. Однако творцы SQL заповедали никаких адресов и смещений не юзать. Отсюда подозрение что задача изначально сформулирована неправильно коли требует смещения в форме имени таблицы к указателю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 07:09:42 |
|
||
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
debloggerПри установлении связи сверху-вниз можно получить ровно 1 штуку. При установлении снизу-вверх - любое количество штук."сверху-вниз" - это, очевидно, "поле image_id в таблице". Что же такое "снизу-вверх"? С одной стороны, по аналогии это поле "table_id" в таблице images. С другой стороны, такой вариант явно не позволит установит "любое количество связей". Собственно, только одну он и сможет установить. Причём весьма специфическую Выражайтесь яснее, пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 07:10:46 |
|
||
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
tanglirЯ не понял, разве вариант с image_id в каждой таблице не позволяет "связать с любой таблицей любое количество изображений"? Или имелось в виду "связать с каждой записью любое количество изображений"? Не позволяет. Количество связанных с таблицей изображений будет в точности равно количеству записей в ней, а не любому количеству, даже если там вообще ни одного изображения не связано (ну, то есть image_id is NULL). Следовательно формулировка связать с каждой записью любое количество изображений - тавтология. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 07:13:21 |
|
||
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
tanglir, эх, замутнел ваш ХШ... а давайте погадаем (у нас тут погода стремная): ИМХО, ТС путает направление связи 1:М с указателями в ЯП. Как раз несимметричная связь 1:М, позволяет иметь много картинок к одной строке... а также "внезапно", иметь каждую строку со своим набором капртинок. "1:М" фактически утверждает единственность строки, к которой привязана заданная/конкретная картинка. Связи типа "М:М" требуются тогда (и только тогда!) когда требуется одну и туже запись о картинке сопоставить с несколькими заданными строками в других таблицах... ну типа, нам дорого плодить несколько одинаковых названий файла с картинкой... так бывает тоже. Решается, как всем известно, опять же легко добавлением доп. таблицы связи... но вот тут, возможны варианты, ибо или их надо плодить к каждой базовой сущности, или переходить на гуйид, или делать динамический скуль... чего многие СУБД - очень не любют... Судя по другим высказываниям, пока склоняюсь к первому абзацу :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 07:18:43 |
|
||
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
tanglirВыражайтесь яснее, пожалуйста. Читайте внимательнее и вообще подразумевается что жевать не придется. Меня интересует либо способ идентифицировать таблицу не используя ее имя (и прочие длинные варианты), либо какой-то принципиально иной способ который не потребует использовать ее имя (и прочие длинные варианты). Снизу-сверху положения относительные. Мост на самом деле получается посредине. Слева у него куча не уникальных parent_id (по логике отношений), справа куча не уникальных image_id. То есть реализуется модель многие ко многим. Все было бы шиколадно если бы parent_id однозначно указывал на id реципиента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 07:21:17 |
|
||
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
deblogger, зачёт. Вам уже двое сказали что надо и как показать, чтобы спросить... DDL вашего parent_id - хде? "Чукча - не читатель"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 07:25:19 |
|
||
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
tanglirdebloggerПри установлении связи сверху-вниз можно получить ровно 1 штуку. При установлении снизу-вверх - любое количество штук."сверху-вниз" - это, очевидно, "поле image_id в таблице". Что же такое "снизу-вверх"? С одной стороны, по аналогии это поле "table_id" в таблице images. С другой стороны, такой вариант явно не позволит установит "любое количество связей". Собственно, только одну он и сможет установить. Причём весьма специфическую Выражайтесь яснее, пожалуйста. deblogger -- неплохой проект. Человек сталкнулся с одной из извесных проблем ОРМ-а и считает что открыл Америку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 07:26:04 |
|
||
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
debloggerМост на самом деле получается посредине. Слева у него куча не уникальных parent_id (по логике отношений), справа куча не уникальных image_id. То есть реализуется модель многие ко многим.Ну вот, можете же, когда захотите :) debloggerВсе было бы шиколадно если бы parent_id однозначно указывал на id реципиента.это возможно только еслиArhat109переходить на гуйид ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 07:27:27 |
|
||
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
javajdbc, Вы - уверены, что тут именно столкновение с "известной проблемой ОРМ", а не банальная путаница в понятии "связь"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 07:29:00 |
|
||
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
tanglir >> это возможно только если... >>>>переходить на гуйид врядли поможет, ведь СКЛ не может статически разрешить имя таблицы (собствено с чего ТС и начала разговор). Решается "легко" динамикой (генерацией) СКЛа. СОвременные фреймворки (например ruby-on-rails) -- это делают елемнтарно сами ---ничего даже писать не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 07:34:44 |
|
||
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
Arhat109Связи типа "М:М" требуются тогда (и только тогда!) когда требуется одну и туже запись о картинке сопоставить с несколькими заданными строками в других таблицах... ну типа, нам дорого плодить несколько одинаковых названий файла с картинкой... так бывает тоже. Решается, как всем известно, опять же легко добавлением доп. таблицы связи... но вот тут, возможны варианты, ибо или их надо плодить к каждой базовой сущности, или переходить на гуйид, или делать динамический скуль... чего многие СУБД - очень не любют... Так и записано в первом сообщении, только несколько иным языком. За исключением отрезанной части. Откуда 1:М если совершенно ясно что будет 1:1. Примеры что ли придумывать? create table prod ( id int auto_ blah-blah, name varchar(50), image varchar(255) ); create table pubs ( id int auto_ blah-blah, content text, image varchar(255) ); create table menu ( id int auto_ blah-blah, name varchar(50), image varchar(255) ); create table ad ( id int auto_ blah-blah, url varchar(50), image varchar(255) ); Ну и так далее М очевидно не фигурирует. Имена файлов вообще не при чем. Изображение характеризуется несколькими параметрами которые в данном случае продукту (а равно публикации, модели, коллекции, альбому и тп) в упор не стучат. Другими словами даже если нужна была 1 картинка, под картинки все равно была бы заведена своя таблица. А в данном конкретном случае имя файла вообще не существует, но сохраняется для имитации человеческого отношения в интерфейсе. Пришлось-таки жевать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 07:39:03 |
|
||
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
Arhat109javajdbc, Вы - уверены, что тут именно столкновение с "известной проблемой ОРМ", а не банальная путаница в понятии "связь"? Уверен! СУдя еше и по его увереному совету (в другом топике) раделять дату и время -- человек явно считает себя специалистом в какой-то области -- но где-то далеко от баз данных, может доморошеный обьектно-ориентированый товарищ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 07:39:13 |
|
||
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
javajdbc, в первом посту было: "Но как-то все не сшивается если захотеть получать изображения." ответ: чтобы получить изображение, в данном случае достаточно считать файл с изображением по его названию, получаемому из дочерней таблицы. Всё. Ни о каком Скуле - тут, речи нет. , но далее имеем нечто другое: "Выкидываем из таблиц поле image_id, заводим таблицу image_list куда оно и переезжает в паре с указателем на родителя: (int id auto_increment, int parent_id, int image_id). Теперь можно связать с любой таблицей любое количество изображений." с одной стороны автор показывает создание типичной таблицы связи М:М для заданной пары сущностей согласно описанной структуре таблицы связи... , но потом "внезапно" переходит на связи картинок с разными сущностями "теперь .. с любой таблицей..." -- этот пассаж - откуда?!Ё ... конечно БУДЕТ проблема. Потому что из сделанного предположения, сделанный вывод - НИКАК НЕ ВЫТЕКАЕТ. ... далее, типовые решения, которых более чем достаточно в 99% конкретных случаев, "внезапно" названы "геммороем"... с чего бы это? С того, что боевая реализация "не про картинки вовсе" и там такое надо?!? или с банального непонимания, что из одного - другое тупо НЕ следует... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 07:46:53 |
|
||
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
Arhat109javajdbc, в первом посту было: "Но как-то все не сшивается если захотеть получать изображения." ответ: чтобы получить изображение Как там выше замечено, чукча не читатель. Написано же - изображения, а не изображение. С одним никаких проблем, со многим ко многим единственная в том, что у многих может совпасть id. Самый коротки путь ввести смещение говоря языком программирования, или дополнительный критерий отбора языком запросов. Это опять же элементарно если сохранять вместе с отче_йди фамилию его семьи (имя таблицы). Я счел это расточительным и хотел узнать можно ли где-то отыскать нечто типа ID из четырех байтов. Ну и вторая часть - может быть вообще все делается иначе, а я отстал от прогресса. Однако пока что ни то ни другое не прояснилось ни на бит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 07:51:56 |
|
||
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
javajdbctanglir >> это возможно только если... >>>>переходить на гуйид врядли поможет, ведь СКЛ не может статически разрешить имя таблицы (собствено с чего ТС и начала разговор). Решается "легко" динамикой (генерацией) СКЛа.Да, это я чего-то не в ту степь пошёл. Подумал, что можно иметь связку "гуид-таблица", а к гуидам уже цеплять файлы. Может, был бы в такой структуре смысл, если бы ещё что-то надо было цеплять (много таблиц связей - одна для файлов, другая-третья-пятая ещё для чего-то...), чтобы не писать в каждую таблицу связи ссылку на исходную таблицу. Но у ТСа связь всего одна, так что проще сразу делать так {имя_таблицы, ид_записи_в_таблице, ид_файла}. И потом динамикой, да, по-другому никак. Если уж так не хочется делать связки для каждой таблицы в отдельности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 07:52:07 |
|
||
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
debloggerЯ счел это расточительным и хотел узнать можно ли где-то отыскать нечто типа ID из четырех байтов. Ну и вторая часть - может быть вообще все делается иначе, а я отстал от прогресса.Нет. Но вы можете сами сделать такой велосипед (сделать метатаблицу, забить в неё все таблицы, дать каждой свой ид...). Нет. По крайней мере в РСУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 07:55:29 |
|
||
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
deblogger, ну вот и давайте "пожуем": и так в первом посту у вас было решение: Есть некоторое количество таблиц каждая со своей структурой среди которых таблица с именем, например image и полями для краткости изложения: id int auto_increment, filename varchar(255) то есть ваш разжеванный вариант превращается в: create table images ( id int auto increment, file_name varchar(255), image_data /* прочие описания картинки, если нужны */ ); /* и далее с модификацией (не называйте поля таблиц служебными словами, таки!): */ create table prod ( id int auto_ blah-blah, name1 varchar(50), image_id int /* можно даже добавить fkey на images */ ); create table pubs ( id int auto_ blah-blah, content text, image_id int /* можно даже добавить fkey на images */ ); create table menu ( id int auto_ blah-blah, name2 varchar(50), image_id int /* можно даже добавить fkey на images */ ); create table ad ( id int auto_ blah-blah, url varchar(50), image_id int /* можно даже добавить fkey на images */ ); ... собственно как и написано в первом абзаце -- по номеру картинки, получаем её изображение. В чём проблема? (жуем дальше) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 07:56:23 |
|
||
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
Arhat109, но потом "внезапно" переходит на связи картинок с разными сущностями "теперь .. с любой таблицей..." -- этот пассаж - откуда?!Ё В этом и весь цукерберг. Все таблицы разношерстные и все хотят быть связанными с произвольным числом изображений. Например менегер заводит номенклатуру и связывает несколько картинок с ней. Журналист пишет статью и связывает с ней несколько картинок и того же самого источника. Дизайнер делает витрину и связывает с ней несколько картинок из того же самого источника. У каждого своя таблица, но таблица изображений со всей спецификой - одна на всех. Чтобы залинковать в 1 запись больше чем 1 изображение требуется диспетчерская. Но диспетчер оказывается в неоднозначном положении на своем стуле, поскольку у каждого из вышеперечисленных пересекающийся набор идентификаторов. Епрст, вроде бы тривиально, а уже столько постов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 08:00:39 |
|
||
|
Где у таблицы ID?
|
|||
|---|---|---|---|
|
#18+
Arhat109, так, пока писал появился вариант с несколькими изображениями... ну и вариант с таблицами связи вас "чем не устраивает"? делаем так: create table link_prod_images ( prod_id int /* внешний ключик на таблицу prod */ , image_id int /* внешний ключик на таблицу images */ , primary_key( prod_id, images_id) /* суррогат тут явно не требуется */ ); и сопровождаем каждую сущность такой табличкой связи... чем вас этот вариант НЕ устраивает? (собственно, это ваш же второй абзац!) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 08:00:57 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38323605&tid=1836477]: |
0ms |
get settings: |
5ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
42ms |
get topic data: |
8ms |
get forum data: |
1ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 363ms |

| 0 / 0 |
