MySQL - ламерски въпрос

4 отговора 399 прегледа
#1

MySQL - ламерски въпрос

Моля простете ми ламерския въпрос.
Имам проста база данни (MySQL) с 2 таблици words и sentences.

__ ____ __ ________
| | | | | |
|id|word| |id|sentence|
|__|____| |__|________|
| | | | | |
|1 |abc | |4 | entry1 |
|__|____| и |__|________|
| | | | | |
|2 |klm | |2 | entry2 |
|__|____| |__|________|
| | | | | |
|3 |stu | |2 | entry3 |
|__|____| |__|________|
| | | | | |
|4 |xyz | |3 | entry4 |
|__|____| |__|________|


Както се вижда в таблицата words 'id' е уникално,
докато в sentences сочи към съответната word от words.

За да покажа всичките sentences които отговарят на даден word използвам заявки от сорта на:

pointer = SELECT id FROM words WHERE word='variable'
SELECT sentence FROM sentences WHERE id='pointer'

т.е. 2 MySQL queries
и някак си не ми се струва елегантно.
Интересува ме въобще вярна ли ми е концепцията на така структурирани таблици и мога ли да ползвам само едно query (нямам предвид вложен SELECT)

Благодаря!

Отговор
в отговор на Mилeнa #2

Re: MySQL - ламерски въпрос

ми що не пробваш с join ?

select s.sentence from sentences s, words w
where s.id=w.id and w.word='variable';

а за концепцията не знам, зависи какво се опитваш да постигнеш с цялата история

Редактирано от тoшo на

Отговор
в отговор на тoшo #3

Благодаря! Работи перфектно!

Благодаря! Работи перфектно!
За таблиците... Имам речник с думи и стотина примерни изречения с всяка дума. С търсене на дадена дума искам да показвам всички примерни изречения за тази дума. Дали тази структура с 2-те таблици е оптимална?
Благодаря пак!

Отговор
в отговор на Mилeнa #4

Re: Благодаря! Работи перфектно!

ми малко те ограничава тая структура. например не можеш да имаш едно изречение да е вързано за повече от една дума, освен ако не записваш изречението повече от веднъж. принципно и така може, но не е по правилата за оптимален дизайн, които освен всичко друго гласят че не трябва да се записва едно нещо повече от веднъж, не се сещам точно какъв беше термина. ако си правиш базата за конкретно нещо и не ти дреме дали е по правилата, и не очакваш милиони изречения, става и така както си го направила; ако обаче ти е за курсова работа или нещо от сорта където ще го гледат хора които ще търсят да се заяждат, може да помислиш за свързваща таблица, където да описваш релациите, а таблиците за думи и изречения да имат уникално id за всеки елемент. свързващата таблица има две полета: sentid и wordid и съдържа неуникални двойки от сорта 1-2, 4-2, 4-3 и пр. След това пак с join можеш да вържеш трите таблици, например:

select s.sentence from sentences s, words w, relation r
where s.id=r.sentid and
r.sentid=r.wordid and
r.wordid=w.id and
w.word='someword';

за да е максимално бързо всичко, би трябвало да се индексират двете полета на words, двете полета на relation и id на sentences.

Редактирано от тoшo на

Отговор
в отговор на тoшo #5

Re: Благодаря! Работи перфектно!

Благодаря! За собствено ползване е, а и нямам изречения, които да се връзват с повече от една дума. Просто ми се искаше да е ok за мене си.

Отговор