|
автоматизация связей многие-к-многим хелп!
|
|||
---|---|---|---|
#18+
доброго времени суток. начал изучать sql для создания небольшой базы хранения объектов и их тегов (закладок) собственно структуру придумал такую: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37.
собственно этот код вроде работает нормально, но добавлять новые записи довольно утомительно, поэтому был придуман способ: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
в общем то код работает, записи добавляются, но вот сижу ломаю голову как заполнить таблицу связей тоже автоматически, может кто подскажет что? ато вечер, голова не бум бум, да и в sql я новичёк совсем ещё. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2019, 20:02 |
|
автоматизация связей многие-к-многим хелп!
|
|||
---|---|---|---|
#18+
Код: sql 1.
Это нарушение первой нормальной формы, а еще есть вторая и третья нормальные формы, если эти термины ни о чем не говорят, то гугл в помощь, там букв немного, советую для начала изучить теорию реляционных СУБД. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2019, 20:14 |
|
автоматизация связей многие-к-многим хелп!
|
|||
---|---|---|---|
#18+
Dima T Код: sql 1.
Это нарушение первой нормальной формы, а еще есть вторая и третья нормальные формы, если эти термины ни о чем не говорят, то гугл в помощь, там букв немного, советую для начала изучить теорию реляционных СУБД. прочёл честным образом статьи в википедии вплоть до 3й нормальной формы, там моя голова вскипела и я пожалуй позже почитаю. к такому решению пришлось прийти, поскольку не смог нагуглить ни 1 способа в SQLite заполнять таблицы данных и их связующей таблицы без необходимости запоминания и последующего прописывания ID топиков и соответствующих им тегов. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2019, 20:41 |
|
автоматизация связей многие-к-многим хелп!
|
|||
---|---|---|---|
#18+
pgetwinkпрочёл честным образом статьи в википедии вплоть до 3й нормальной формы, там моя голова вскипела и я пожалуй позже почитаю. Для начала лучше поспать, а потом читать и вникать. В теории РСУБД есть правила, которые надо знать и не надо нарушать, а если нарушишь получишь трудноразрешимые проблемы. Теория работает только на правильно оформленных данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2019, 20:50 |
|
автоматизация связей многие-к-многим хелп!
|
|||
---|---|---|---|
#18+
Из упрямства доделал всё же свой вариант сам Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
и даже попользовался немного, наслаждаясь простотой добавления документов Код: sql 1. 2. 3. 4.
но спустя несколько минут понял что данная форма годится только для добавления новых записей. переписал так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
так что теперь у меня полностью автоматическое заполнение таблиц тегов, данных и их связей. ура. (удаление связей тоже автоматическое) осталось только понять как получить список файлов у которых есть несколько тегов... файлы с 1 тегом получаю так: Код: sql 1. 2. 3. 4.
но неужели сложность выборки будет расти по экспоненте при увеличении числа тегов поиска? ведь прийдётся каскадно наращивать запрос как я понимаю, это ж сколько join-ов надо... вариант Код: sql 1. 2. 3.
не подходит т.к. даст все файлы с тегами 'wife' или 'mail' а не 'wife' и 'mail' ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2019, 12:30 |
|
автоматизация связей многие-к-многим хелп!
|
|||
---|---|---|---|
#18+
Всё, разобрался, уф.. как всегда сам, чёт никто новичкам не хочет кроме меня помогать, а ведь начало то оно самое и трудное. спасибо хоть 1 чел вовремя меня поправил насчёт 1 формы, атоб так и пилил дальше. Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2019, 16:45 |
|
автоматизация связей многие-к-многим хелп!
|
|||
---|---|---|---|
#18+
pgetwinkсобственно структуру придумал такую: Тут все правильно. pgetwink Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
А это сложносочиненная ересь. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
pgetwinkсобственно этот код вроде работает нормально, но добавлять новые записи довольно утомительно,ну так потому и утомительно что ты не понял собственной структуры. Ты точно сам придумал эти три таблицы? А вообще, добавление записей в эти три таблицы очень простая операция. Надо только понять что это три таблицы и они хоть и связаны, но продолжают оставаться тремя таблицами. Просто поверь что объекты (topic) и тэги (tags) это соверешенно разные сущности. Добавляешь и изменяешь их по отдельности, а потом связываешь их (topic_tag). ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2019, 02:08 |
|
автоматизация связей многие-к-многим хелп!
|
|||
---|---|---|---|
#18+
pgetwinkDima T Код: sql 1.
Это нарушение первой нормальной формы, а еще есть вторая и третья нормальные формы, если эти термины ни о чем не говорят, то гугл в помощь, там букв немного, советую для начала изучить теорию реляционных СУБД. прочёл честным образом статьи в википедии вплоть до 3й нормальной формы, там моя голова вскипела и я пожалуй позже почитаю.Почитай. Теория это полезно. А чтобы мозги не вскипали - попробуй сделать это все не в базе данных, а на бумажке. Возьми тетрадку, карандаш - на трех отдельных листочках нарисуй свои три таблицы. А теперь запиши в них карандашиком свои данные. Подумай как это сделать удобнее всего при помощи карандаша. Потом переноси это в компьютер. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2019, 02:13 |
|
автоматизация связей многие-к-многим хелп!
|
|||
---|---|---|---|
#18+
pgetwinkВсё, разобрался, уф.. как всегда сам, чёт никто новичкам не хочет кроме меня помогать, а ведь начало то оно самое и трудное. В этом форуме мало кто бывает, к тому же в выходные. Как понимаю то, что ты изобретаешь называется модель EAV . Тут обсуждали эту тему. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2019, 07:59 |
|
автоматизация связей многие-к-многим хелп!
|
|||
---|---|---|---|
#18+
White Owlpgetwinkсобственно этот код вроде работает нормально, но добавлять новые записи довольно утомительно,ну так потому и утомительно что ты не понял собственной структуры. Ты точно сам придумал эти три таблицы? А вообще, добавление записей в эти три таблицы очень простая операция. Надо только понять что это три таблицы и они хоть и связаны, но продолжают оставаться тремя таблицами. Просто поверь что объекты (topic) и тэги (tags) это соверешенно разные сущности. Добавляешь и изменяешь их по отдельности, а потом связываешь их (topic_tag). Я прекрасно понимаю что пишу, но немного нехватает глубоких знаний по синтаксису и принципам выполнения команд (пока что). кстати, ваш код для выборки по тегам и файлам не работает в SQLite3 к сожалению (вероятно в более развитых базах данных он и сработает, но SQLite не понимает что от неё хотят) с ёё точки зрения нет никакой связи между topic, tags и topic_tags поэтому и пришлось писать 2 JOIN но спасибо за наводку, обязательно почитаю про модель EAV ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2019, 21:32 |
|
автоматизация связей многие-к-многим хелп!
|
|||
---|---|---|---|
#18+
кстати, под "сложностью добавления" я имел в виду "сложность добавления 1 файла из командной строки в 1 команду с несколькими тегами" в приложении у меня изначально так записи и добавлялись сначала в topic потом в tags затем связи устанавливались. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2019, 21:37 |
|
автоматизация связей многие-к-многим хелп!
|
|||
---|---|---|---|
#18+
pgetwinkкстати, ваш код для выборки по тегам и файлам не работает в SQLite3 к сожалению (вероятно в более развитых базах данных он и сработает, но SQLite не понимает что от неё хотят) с ёё точки зрения нет никакой связи между topic, tags и topic_tags поэтому и пришлось писать 2 JOINНе работает, потому что я ошибся. У тебя три таблицы значит и join должен быть двойной - это верно. А вот вложенные выборки тебе не нужны. В общем, вот тебе базовый запрос который можно фильтровать по любой из трех таблиц: Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2019, 16:12 |
|
автоматизация связей многие-к-многим хелп!
|
|||
---|---|---|---|
#18+
White Owlpgetwinkкстати, ваш код для выборки по тегам и файлам не работает в SQLite3 к сожалению (вероятно в более развитых базах данных он и сработает, но SQLite не понимает что от неё хотят) с ёё точки зрения нет никакой связи между topic, tags и topic_tags поэтому и пришлось писать 2 JOINНе работает, потому что я ошибся. У тебя три таблицы значит и join должен быть двойной - это верно. А вот вложенные выборки тебе не нужны. В общем, вот тебе базовый запрос который можно фильтровать по любой из трех таблиц: Код: sql 1. 2. 3. 4.
Спасибо, но мне такой вариант не подходит, так как могут быть документы без тегов, как и теги могут быть "висячими" (оставшиеся без документов в результате удаления). ps. Я времени даром не терял, у меня уже полностью оптимизированы запросы, выборки строятся исключительно по ID, база данных наполняется и всё работает максимально шустро, даже выборки по условию И по нескольким тегам (самый сложный запрос) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2019, 21:54 |
|
автоматизация связей многие-к-многим хелп!
|
|||
---|---|---|---|
#18+
Стоп, я кажется понял что вы имели в виду, поправьте если неправ: таблица связей самая большая поэтому выборка должна изначально делаться из неё потому что каждый последующий JOIN как бы это сказать... "усложняет сложность" в зависимости от размера таблицы (читал, что вроде как там умножение), другими словами умножить базу на салую таблицу а потом базу на произведение 1 и 2? так чтоли? надо будет мне потестировать как напишу парсер документов и наполню базу... Спасибо ещё раз, если это так то вы меня очень выручили. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2019, 22:10 |
|
автоматизация связей многие-к-многим хелп!
|
|||
---|---|---|---|
#18+
сорри, незнаю как исправить очепятку, "салую" читать как "малую" ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2019, 22:12 |
|
автоматизация связей многие-к-многим хелп!
|
|||
---|---|---|---|
#18+
pgetwinkСпасибо, но мне такой вариант не подходит, так как могут быть документы без тегов, как и теги могут быть "висячими" (оставшиеся без документов в результате удаления). Документ без тегов это значит строка в topic не имеющая ни одной строки в topic_tag. И тоже самое для тегов. А значит и искать такие topic и tag проще простого: Код: sql 1. 2. 3.
Достаточно задать вопрос "что я ищу?" И не стесняйся рисовать таблички и работать с ними на бумаге - это ооочень помогает понять что ты делаешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2019, 01:48 |
|
автоматизация связей многие-к-многим хелп!
|
|||
---|---|---|---|
#18+
pgetwinkСтоп, я кажется понял что вы имели в виду, поправьте если неправ: таблица связей самая большая поэтому выборка должна изначально делаться из неё потому что каждый последующий JOIN как бы это сказать... "усложняет сложность" в зависимости от размера таблицы (читал, что вроде как там умножение), другими словами умножить базу на салую таблицу а потом базу на произведение 1 и 2? так чтоли? надо будет мне потестировать как напишу парсер документов и наполню базу... И да и нет. Ты правильно понял что join добавляет еще одно произведение, но я показал порядок topic_tag join topic join tags просто для иллюстрации множественных связей. На самом деле ты можешь сделать и цепочку Код: sql 1. 2. 3.
И даже вообще без явных join'ов: Код: sql 1. 2.
Функционально это все равнозначно и равноценно. Просто выбираешь то что тебе кажется более читабельным и легче для понимания. Но для сервера это все одно и то-же. На самом деле очень сложно сказать какой порядок таблиц в join'ах будет более эффективным. По скорости может быть лучше брать маленькую таблицу сначала и навешивать на нее большую, может быть наоборот. Все зависит от данных и насколько эти данные покрыты индексами. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2019, 02:02 |
|
|
start [/forum/topic.php?fid=54&fpage=3&tid=2008403]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
83ms |
get tp. blocked users: |
1ms |
others: | 249ms |
total: | 408ms |
0 / 0 |