Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Relacje
opmsoft
post 1.03.2012, 20:18:37
Post #1





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 17.11.2010

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
ano
post 1.03.2012, 21:18:31
Post #2





Grupa: Zarejestrowani
Postów: 435
Pomógł: 40
Dołączył: 16.02.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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"

Ten post edytował ano 1.03.2012, 21:25:23


--------------------
Linkedin | ...
Go to the top of the page
+Quote Post
bww
post 1.03.2012, 21:22:58
Post #3





Grupa: Zarejestrowani
Postów: 42
Pomógł: 3
Dołączył: 14.02.2012

Ostrzeżenie: (0%)
-----


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ć.

Ten post edytował bww 1.03.2012, 21:25:32
Go to the top of the page
+Quote Post
opmsoft
post 2.03.2012, 13:41:27
Post #4





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 17.11.2010

Ostrzeżenie: (0%)
-----


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

Ten post edytował opmsoft 2.03.2012, 13:43:02
Go to the top of the page
+Quote Post
bww
post 2.03.2012, 13:55:54
Post #5





Grupa: Zarejestrowani
Postów: 42
Pomógł: 3
Dołączył: 14.02.2012

Ostrzeżenie: (0%)
-----


Nie rozumiem po co dla każdego rodzaju newsa tworzyć osobną tabelę...
Go to the top of the page
+Quote Post
askone
post 2.03.2012, 14:27:31
Post #6





Grupa: Zarejestrowani
Postów: 654
Pomógł: 121
Dołączył: 27.10.2007
Skąd: Poznań, Łódź

Ostrzeżenie: (0%)
-----


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


--------------------
Kliknij jeśli moja odpowiedź Ci pomogła.
askone.pl
Go to the top of the page
+Quote Post
opmsoft
post 2.03.2012, 23:48:46
Post #7





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 17.11.2010

Ostrzeżenie: (0%)
-----



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
Go to the top of the page
+Quote Post
Orzeszekk
post 3.03.2012, 01:14:56
Post #8





Grupa: Zarejestrowani
Postów: 260
Pomógł: 14
Dołączył: 8.09.2011

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Orzeszekk 3.03.2012, 01:15:49


--------------------
"The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time."
Tom Cargill, Bell Labs
Go to the top of the page
+Quote Post
opmsoft
post 5.03.2012, 12:52:50
Post #9





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 17.11.2010

Ostrzeżenie: (0%)
-----


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 ?
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 23.06.2025 - 06:07