Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Relacje
Forum PHP.pl > Forum > Bazy danych > MySQL
opmsoft
Cześć,
mam taki poblem.
Mam do zrobienia system newsów są 3 typy Samochody motory i jachty

Powiedzmy mam tabelę NEWS i w niej pola id, rating, title , id_moto_params, id_auto_params, id_boat_params

Tabela = id_moto marka, model, pojemność, ..


i w zależności od typu wpisu dodaję id_moto/auto/boat do tabeli news

strasznie zagmatwane i mam nadzieję że zrozumiecie?

Ps.
Problem podobny np w allegro aukcja ma kilka identycznych parametrów np cena, czas trwania + przedmioty z różnymi parametrami np, stan , rozmiar a w innej wielkość, moc

Pozdrawiam
ano
Możesz zrobić 'odwróconą' tabele (key-value table).
Struktura relacji:
Parameters(ID_newsa, key, value) (klucz złożony na id_newsa i key)
News(Id, rating, title, type) gdzie type = {moto, auto, boat}

przykład:
Kod
News:
Id | Rating | Title       | Type
-----------------------------------
1  | 2      | Jakiś tytuł | 10
-----------------------------------
2  | 5      | Tytuł 2     | 20
-----------------------------------

(Type 10 = auto; Type 20 = boat)

Parameters:
Id_newsa | Key           | Value
---------------------------------
1        | Pojemność     | 2.0
---------------------------------
1        | Rok produkcji | 1998
---------------------------------
2        | Wyporność     | 666
---------------------------------
2        | Cena          | 525252


w parameters byłaby duża redundancja danych, dlatego możesz do tego dodać tabelę słownikową:
TypyParametrów(id, nazwa, opis) (opis tak strzeliłem wink.gif
np:
Kod
1 | Pojemność      | Blablabla
2 | Rok produkcji  | Blablabla


wtedy w tabeli Parameters nie używałbyś 'słownego' zapisu "Pojemność" a powiązania z TypemParametru o ID "1"
bww
Może tak:

NEWS
id_news

PARAMS
id_params
id_type
param -- np. pojemność

TYPE
id_type
type_name -- np. samochód

PARAM_NEWS
id_news
id_params
value -- np. 1.4

Wychodzę z założenia, że listę parametrów i typów pojazdów trzymasz w bazie.
Każdy news może mieć wtedy n parametrów o wartości value, a każdy parametr należy do danego typu środka transportu.

Jak źle myślę, to proszę mnie poprawić.
opmsoft
Dzięki za odpowiedz jutro zmodyfikuję wasze wskazówki i pokażę do oceny


CODE

Id | Rating | Title | id_moto_news | id_boat_news |
--------------------------------------------------------------------
1 | 2 | Jakiś tytuł moto | 1 | null
---------------------------------------------------------------------
2 | 5 | Tytuł boat | null | 2
--------------------------------------------------------------------



moto news
Id_newsa | pojemność | marka |
------------------------------------------
1 | 2.0 | volvo |
-------------------------------------------

boat news
Id_newsa | liczba pasażerów | zasięg |
--------------------------------------------------
2 | 2000 | 1000 mil |
--------------------------------------------------



Ja bym zrobił tak co o tym sądzicie ?

@edit coś się rozjechało ale wiadomo o co chodzi wink.gif
bww
Nie rozumiem po co dla każdego rodzaju newsa tworzyć osobną tabelę...
askone
Zaproponowana przez Ciebie struktura jest wadliwa. O ile aktualnie wydaje się, że będzie działać to w przyszłości kiedy będziesz chciał dodać nowy typ newsa musisz zrobić:
  1. rozszerzyć tabele główną o nową kolumnę
  2. do wszystkich istniejących wierszy w tabeli głównej wstawić null dla tej kolumny
  3. stworzyć nową tabele dedykowaną dla nowego typu


W przypadku rozwiązań zaproponowanych przez @bww i @ano jedyną rzeczą jaką musisz wykonać to zdefiniować nowy typ no i ewentualne parametry. Osobną kwestią jest np zliczenie wszystkich newsów w podziale na kategorie - w Twym rozwiązaniu musisz wykonaś kilka zapytań lub złączyć kilka tabel (dla każdego typu newsa osobna tabela). W przypadku jednej tabeli wystarczy jedno proste zapytanie na jednej tabeli i dodana klauzula group by...

Mam nadzieję, że Cię przekonałem wink.gif

Pozdrawiam
opmsoft

Nie jestem nadal przekonany powiedzmy przy moim rozwiązaniu dla 100 newsów mamy 200 wpisów 100 do tabeli news i 100 do danych tabel w zależności od typu

Przy rozwiązaniu @ano przy 100 wpisach powiedzmy każdy wpis ma średnio 5 parametrów daje nam to 600 wpisów, 100 w tabeli news + 500 wpisów w tabeli parameters,

drugra sprawa w moim rozwiązaniu wykonuję dwa zapytania, @askone "W przypadku jednej tabeli wystarczy jedno proste zapytanie na jednej tabeli i dodana klauzula group by..." - nie da się tego zrobić na jednej tabeli, przy różnych parametrach dla różnych newsów.

@bww - różne wiele tabeli bo każdy rodzaj newsa ma inne parametry, tak jak w allegro każda kategoria ma różne parametry jak sprzedajesz książke to nie masz pola przebieg tylko np gatunek. ale masz w książce jak i w samochodzie (przebieg) cechy wspólne cena , długość aukcji itp czyli masztabele AUKCJA + TABELE BOOK_PARAMS i AUTO_PARAMS tak jak ja mam
tabele news + auto_param + boat_param

Auto news ma PARAMETRY np:
marka,
model,
moc_silnika

a Boat news ma:
zasięg,
ilość pasażerów
ilośc_kajut .


Jak to teraz widzicie
Orzeszekk
Cytat(opmsoft @ 2.03.2012, 23:48:46 ) *
Nie jestem nadal przekonany powiedzmy przy moim rozwiązaniu dla 100 newsów mamy 200 wpisów 100 do tabeli news i 100 do danych tabel w zależności od typu

Przy rozwiązaniu @ano przy 100 wpisach powiedzmy każdy wpis ma średnio 5 parametrów daje nam to 600 wpisów, 100 w tabeli news + 500 wpisów w tabeli parameters,

drugra sprawa w moim rozwiązaniu wykonuję dwa zapytania, @askone "W przypadku jednej tabeli wystarczy jedno proste zapytanie na jednej tabeli i dodana klauzula group by..." - nie da się tego zrobić na jednej tabeli, przy różnych parametrach dla różnych newsów.

@bww - różne wiele tabeli bo każdy rodzaj newsa ma inne parametry, tak jak w allegro każda kategoria ma różne parametry jak sprzedajesz książke to nie masz pola przebieg tylko np gatunek. ale masz w książce jak i w samochodzie (przebieg) cechy wspólne cena , długość aukcji itp czyli masztabele AUKCJA + TABELE BOOK_PARAMS i AUTO_PARAMS tak jak ja mam
tabele news + auto_param + boat_param

Auto news ma PARAMETRY np:
marka,
model,
moc_silnika

a Boat news ma:
zasięg,
ilość pasażerów
ilośc_kajut .


Jak to teraz widzicie


moze tak?:

tabela NEWS:
news_id int
news_category int
news_object_id int
news_date datetime

tabela NEWS_TEXT
news_id int
news_text varchar
news_title varchar

tabela NEWS_AUTA...
tabela NEWS_JACHTY...

nastepnie tworzysz tabelki dla aut, jachtow itd i np jesli w news_category masz 0 to robisz zapytanie do news_auta, szukajac obiektu o ID rownym news_object_id z newsa, jesli w category masz 1 to szukasz w jachtach ID rownego news_object_id... itd.

NEWS i NEWS_TEXT rozdzielilem na 2 czesci, gdyz NEWS_TEXT bedzie zawierala spore ilosci tekstu w polach varchar ktore sa znacznie wolniejsze od INtów - szybciej bedzie znalezc interesujace nas newsy w tabeli news (wedle kategorii lub nowosci), a pozniej sobie doczytać z nich wlasciwa tresc z tabeli NEWS_TEXT (id w obu tabelach takie samo).

ale jak bedziesz chcial dodac cos nowego (nowa kategorie) to musisz dodac nową tabelę do bazy danych.

dlatego mozna zrobic rowniez tak:

tabela NEWS:
news_id int
news_category int
news_object_id int
news_date datetime

tabela NEWS_TEXT
news_id int
news_text varchar
news_title varchar

tabela OBJECTS
object_id int
object_category int
object_data text

rozwiazanie podobne do poprzedniego. object_category jest narazone na anomailie, ale to ze te dane sa w 2 miejscach spowoduje ze znalezienie newsow z danej kategorii bedzie szybsze.

do tabeli objects walisz wszystkie obiekty (jachty, auta itd), do object_category wpisujesz cyferke oznaczajaca typ = 0-auto, 1-jacht 2-rower 3-motocykl itd, w object_data zapisujesz zserializowaną tablicę zawierającą wszystkie dane dotyczące danego obiektu. To pozwala na dowolna konfiguracje pól - w rowerze moga byc inne, i w dodatku innych typów i w innej ilosci, w aucie inne, w motocyklu inne.
Tylko nie zrobisz selecta wtedy szukajac np najszybszej łodzi albo najpojemniejszego silnika.

zazwyczaj uzywam tego sposobu do danych ktore i tak musza byc odczytane za jednym razem, a zawieraja zmienna liczbe pól.
opmsoft
Oki czyli generalnie nie znaleźliśmy odpowiedniego rozwiązania będzie trzeba przyjąć jakiś kompromis tylko nie wiem jaki może jeszcze ktoś się wypowie ?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.