Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: jak zaprojektować listę produktów
Forum PHP.pl > Forum > Bazy danych > MySQL
mihmih
witam,

moim celem jest uzyskanie listy elementów wchodzących wskład jakiejś większej konstrukcji. Element to produkt pojedynczy (nie składa się z innych), których listę z odpowiednią ilością chciałbym uzyskać. Powiedzmy że konstrukcja składa się z:

element1
element2
złożenie1
złożenie2
złożenie3

złozenie1 składa się z:

element1
element5
złożenie4

złożenie2 skłąda się z:

element1
element6

złożenie3 składa się z:

element2
element3
element4

złożenie4 skłąda się z:

element2
złożenie5

złożenie5 składa się z:

element6
element7

Każdej z tych pozycji może być rożna ilość sztuk, a złożoność konstrukcji może być nieskończona (to znaczy w teorii może być wiele poziomów złożeń, choć w praktyce nie ma ich więcej niż 5). Chciałbym i przetrzymywać informację z czego składa się każde złożenie i do każdej konstrukcji wyodrębnić listę samych elementów z ich ilością na 1 szt konstrukcji. Czy najlepszą metodą jest jedna tabela gdzie będą konstrukcje, złożenia i elementy i jedna tabela łączona (ID, ID_element_poziom wyższy, ID_element_poziom_niższy, ilosc)? A najlepszą metodą listy samych elementów jest konstrukcja UNION, która zakłada że złożoność nie przekroczy np. 5 poziomów?
trueblue
Czy to samo złożenie może być użyte w kilku konstrukcjach?

Ze względu na zagłębienia, wydaje mi się, że pomocne może być drzewo IP - korzeń to konstrukcja, gałąź to złożenie, a liść to element. Ale jeśli elementy są wspólne, a być może i złożenia, to traci to trochę sens.
mihmih
to samo złożenie może whodzic wskłąd różnych konstrukcji
ten sam element może wchodzić wskład różnych złożeń
ten sam element może wchodzić wskład różnych konstrukcji

coś jak klocki lego, jeden klocek może wchodzić wskład i garażu i szpitalu, a ten sam garaż może wchodzić i wskład osiedla nr 1 i wskład osiedla nr 2. A chcąc zbudować osiedle nr 2 muszę mieć listę i ilość wszystkich klocków, które wchodzą wskład garaży, szpitali, bloków, sklepów itd. A czerwony klocek jest potrzebny w ilości 3 sztuk do budowy garażu, a w ilości 5 sztuk w budowie szkoły.
trueblue
Ale czy złożenie o tym samym id może być użyte kilkukrotnie? Nie mam na myśli identyczności zbioru (z1: e1, e2, e3, z2: e1, e2, e3), ale o tą samą krotkę w bazie danych.
Jeśli tak, to abstrahując od problemu, jak zapanujesz nad zarządzaniem złożeniami? Wydaje mi się, że łatwiej budować każdą konstrukcję od podstaw, tj. budując dla niej złożenia i dodawać elementy, niż dobierać złożenia z puli istniejących złożeń. Ktoś tu na forum miał podobny problem. Dotyczył wielościeżkowej ankiety. Ja poleciłem mu budowanie każdej ścieżki odrębnie, nie zważając, że pytania mogą się powtarzać (czyli tworzyć pytania na potrzeby ścieżki niż wybierać z puli pytań).
mihmih
tak, złożenie ID_5 może wchodzić wskład konstrukcji ID_5, konstrukcji ID_8, a nawet wskład złożenia ID_24, które wchodzi wskład konstrukcji ID_17. Tak samo element ID_3 może wchodzić bezpośrednio wskład konstrukcji lub wskład złożenia, które wchodzi wskład konstrukcji, bądź wskład złożenia, które wchodzi wskład złożenia, które wchodzi wskład konstrukcji. To samo złożenie/element może być na innym poziomie złożoności.
trueblue
Ok. Dlaczego tak musi być (mam na myśli użycie złożenia o tym samym id kilkukrotnie)?
mihmih
Spróbuję wyjaśnić na przykładzie.

Sprzedajemy samochód nr 1. W jego wskłąd wchodzi koło_1 (4szt)[element, z niczego już się nie składa], złożenie "silnik_1", 8 śrubek M8[element, z niczego już się nie składa]. Złożenie "silnik_1" składa się z przekładnia_1[złożenie], 4 śrubki M8[element, ten sam co w poziomie wyżej]. Złożenie przekładnia_1 składa się z pas_1 [element, z niczego się już nie składa] i 2 śrubki M4.

Samochód nr 2 składa się z :silnik_1 [złożenie, ten sam silnik co w aucie nr 1], 16 śrubek M4 [element, z niczego się już nie składa, ten sam co w aucie nr 1, ale tutaj występuje poziom wyżej], koło_1 (4szt).

Więc różne konstrukcje (auta) zawierają te same złożenia (np. silnik_1), różne elementy wchodzą wskład różnych złożeń (śrubka M8 raz jest bezpośrednią częścią auta, raz częścią silnika) oraz różne elementy znajdują się na różnych poziomach (np. śrubka M4 raz jest częścią złożenia, które wchodzi wskład konstrukcji, a raz wchodzi bezpośrednio wskład konstrukcji.
trueblue
To może tak:
- tabela konstrukcja,
- tabela konstrukcja_zlozenie (id_konstrukcja, id (id_element lub id_zlozenie), typ (zlozenie/element)),
- tabela zlozenie (tu drzewko ip, ale liście są wskaźnikami na elementy lub złożenia, czyli przechowują id elementów, a nie elementy),
- tabela element.
mihmih
trochę nad tym myślałem i chyba najlepiej włożyć wszystko do jednej tabeli. Po pierwsze wszystkie te rzeczy mają dużo wspólnych cech (kolumn), mają (dzięki temu jedną) tabelę wspólna z tą samą tabelą operacji , po drugie to chyba będzie najprostsze. Oprócz tej wspólnej tabeli zrobię tabele element-element gdzie będę łączył elementy i złożenia w grupy, a listę wszystkich elementów (najniższy poziom) zrobię poprzez UNION. Założe z góry że maksymalnym ilością poziomów będzie 4 i będę pilnował żeby nie było złożenia, które wchodzi wskład złożenia, które wchodzi wskład złożenia, które wchodzi wskład konstrukcji.
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-2024 Invision Power Services, Inc.