Baza danych atrybutów encji a ścisły Model relacyjny Ecommerce

Można śmiało powiedzieć, że model bazy danych EAV/CR jest zły. To powiedziawszy,

Pytanie: jaki model bazy danych, technika lub wzór powinny być używane do czynienia z "klasami" atrybutów opisujących produkty e-commerce, które mogą być zmieniane w czasie uruchomienia?

W dobrej bazie E-commerce będziesz przechowywać klasy opcji (np. rozdzielczość telewizora ma wtedy rozdzielczość dla każdego telewizora, ale następny produkt może nie być telewizorem i nie mieć "rozdzielczości telewizyjnej"). How do you przechowywać je, efektywnie wyszukiwać i pozwalać użytkownikom na konfigurowanie typów produktów ze zmiennymi polami opisującymi ich produkty? Jeśli wyszukiwarka stwierdzi, że klienci zazwyczaj szukają telewizorów na podstawie głębi konsoli, można dodać głębię konsoli do pól, a następnie dodać pojedynczą głębię dla każdego typu produktu tv w czasie uruchamiania.

Jest miłą cechą wspólną wśród dobrych aplikacji e-commerce, gdzie pokazują zestaw produktów, a następnie mają" drill down "menu boczne, gdzie można zobaczyć" rozdzielczość TV " jako nagłówek, oraz pięć najpopularniejszych rozdzielczości TV dla znalezionego zestawu. Klikasz jeden i wyświetla tylko telewizory o tej rozdzielczości, co pozwala na dalsze drążenie w dół, wybierając inne kategorie w menu bocznym. Opcje te byłyby dynamicznymi atrybutami produktu dodanymi w czasie wykonywania.

Dalsza dyskusja:

Tak W skrócie, czy są jakieś linki w Internecie lub opisy modeli, które mogłyby" naukowo " naprawić poniższą konfigurację? I thank Noel Kennedy za zaproponowanie tabeli kategorii, ale potrzeba może być większa. Opisuję to inaczej poniżej, starając się podkreślić znaczenie. Mogę potrzebować korekty punktu widzenia, aby rozwiązać problem, lub mogę potrzebować zagłębić się w EAV/CR.

Kocham pozytywną odpowiedź na model EAV / CR. Moi koledzy Programiści mówią to, co Jeffrey Kemp poruszył poniżej: "nowe podmioty muszą być modelowane i projektowane przez profesjonalistę "(wyjęte z kontekstu, przeczytaj jego odpowiedź poniżej). Na problem polega na tym, że:

  • encje dodają i usuwają atrybuty co tydzień
    (szukane słowa kluczowe dyktują przyszłe atrybuty)
  • co tydzień przybywają nowe podmioty
    (produkty są składane z części)
  • stare byty znikają co tydzień
    (archiwum, mniej popularne, sezonowe)

Klient chce dodać atrybuty do produktów z dwóch powodów:

  • dział / wyszukiwanie słów kluczowych / Wykres porównawczy między podobnymi produkty
  • konfiguracja produktu konsumenckiego przed dokonaniem zakupu

Atrybuty muszą mieć znaczenie, a nie tylko wyszukiwanie słów kluczowych. Jeśli chcą porównać wszystkie ciasta, które mają "lukier z bitą śmietaną", mogą kliknąć ciasta, kliknij motyw urodzinowy, kliknij lukier z bitą śmietaną, a następnie sprawdzić wszystkie ciasta, które są interesujące, wiedząc, że wszystkie mają lukier z bitą śmietaną. Nie jest to specyficzne dla ciast, tylko przykład.

Author: Cœur, 2009-05-16

10 answers

Jest kilka ogólnych plusów i minusów, są sytuacje, w których jeden jest lepszy od drugiego:

Wariant 1, Model EAV:

  • Pro: mniej czasu na zaprojektowanie i opracowanie prostej aplikacji
  • Pro: nowe podmioty łatwe do dodania (może nawet być dodawane przez użytkowników?)
  • Pro: "ogólne" komponenty interfejsu
  • Con: złożony kod wymagany do walidacji prostych typów danych
  • Con: znacznie bardziej złożony SQL dla prostych raporty
  • Con: complex raporty mogą stać się niemal impossible
  • Con: słaba wydajność dla dużych zbiorów danych

Wariant 2, Modelowanie każdego podmiotu oddzielnie:

    Con: potrzeba więcej czasu na zebranie wymagania i konstrukcja
  • Con: nowe podmioty muszą być modelowane i designed by a professional
  • Con: niestandardowe komponenty interfejsu dla każdego entity
  • Pro: ograniczenia typów danych i Walidacja prosta do wdrożenia
  • Pro: SQL jest łatwy do napisania, łatwy do zrozumieć and debug
  • Pro: nawet najbardziej złożone raporty są stosunkowo proste
  • Pro: Najlepsza wydajność dla dużych zbiorów danych

Opcja 3, kombinacja (modeluj encje "poprawnie", ale Dodaj "rozszerzenia" dla niestandardowych atrybutów dla niektórych/wszystkich encji)

  • Pro / Con: potrzeba więcej czasu na zebranie wymagań i projektu niż opcja 1, ale być może nie tak dużo jak Opcja 2 *
  • Con: nowe podmioty muszą być modelowane i projektowane przez profesjonalistę
  • Pro: nowy atrybuty mogą być łatwo dodane później
  • Con: złożony kod wymagany do walidacji prostych typów danych (dla niestandardowych atrybutów)
  • Con: niestandardowe komponenty interfejsu nadal są wymagane, ale ogólne komponenty interfejsu mogą być możliwe dla niestandardowych atrybutów
  • Con: SQL staje się złożony, gdy tylko dowolny niestandardowy atrybut zostanie dołączony do raportu
  • Con: ogólnie dobra wydajność, chyba że zaczniesz szukać według własnych atrybutów lub raportować według własnych atrybutów

* nie jestem pewien, czy Opcja 3 musiałaby zaoszczędzić czas w fazie projektowania.

Osobiście skłaniałbym się ku opcji 2 i unikałbym podsłuchu, gdzie to tylko możliwe. Jednak w niektórych scenariuszach użytkownicy potrzebują elastyczności związanej z EAV; ale wiąże się to z dużymi kosztami.

 71
Author: Jeffrey Kemp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-26 23:03:54

Można śmiało powiedzieć, że model bazy danych EAV / CR jest zły.

Nie, Nie jest. Chodzi o to, że są nieefektywnym wykorzystaniem relacyjnych baz danych. Sklep czysto klucz / wartość działa świetnie z tym modelem.

Teraz, do twojego prawdziwego pytania: jak przechowywać różne atrybuty i zachować je do przeszukiwania?

Po prostu użyj EAV. W Twoim przypadku byłby to jeden dodatkowy stolik. indeksuje zarówno nazwę atrybutu jak i wartość, większość RDBMs używa prefix-compression do powtórzenia nazw atrybutów, dzięki czemu jest naprawdę szybki i kompaktowy.

EAV / CR staje się brzydki, gdy używasz go do zastępowania "prawdziwych" pól. Jak w przypadku każdego narzędzia, nadużywanie go jest " złe " i nadaje mu zły obraz.

 57
Author: Javier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-15 21:44:54
// At this point, I'd like to take a moment to speak to you about the Magento/Adobe PSD format.
// Magento/PSD is not a good ecommerce platform/format. Magento/PSD is not even a bad ecommerce platform/format. Calling it such would be an
// insult to other bad ecommerce platform/formats, such as Zencart or OsCommerce. No, Magento/PSD is an abysmal ecommerce platform/format. Having
// worked on this code for several weeks now, my hate for Magento/PSD has grown to a raging fire
// that burns with the fierce passion of a million suns.

Http://code.google.com/p/xee/source/browse/trunk/XeePhotoshopLoader.m?spec=svn28&r=11#107

Wewnętrzne modele są w najlepszym razie zwariowane, jakby ktoś włożył schemat do gry boggle, zapieczętował go i włożył do paint shacker...

Real world: pracuję nad aplikacją spełniającą wymagania midware i oto jedna z zapytań, aby uzyskać informacje o adresie.

CREATE OR REPLACE VIEW sales_flat_addresses AS
SELECT sales_order_entity.parent_id AS order_id, 
       sales_order_entity.entity_id, 
       CONCAT(CONCAT(UCASE(MID(sales_order_entity_varchar.value,1,1)),MID(sales_order_entity_varchar.value,2)), "Address") as type, 
       GROUP_CONCAT( 
         CONCAT( eav_attribute.attribute_code," ::::: ", sales_order_entity_varchar.value )
         ORDER BY sales_order_entity_varchar.value DESC
         SEPARATOR '!!!!!' 
       ) as data
  FROM sales_order_entity
       INNER JOIN sales_order_entity_varchar ON sales_order_entity_varchar.entity_id = sales_order_entity.entity_id
       INNER JOIN eav_attribute ON eav_attribute.attribute_id = sales_order_entity_varchar.attribute_id
   AND sales_order_entity.entity_type_id =12
 GROUP BY sales_order_entity.entity_id
 ORDER BY eav_attribute.attribute_code = 'address_type'

Pobiera dane adresowe do zamówienia, leniwie

--

Podsumowanie: używać tylko Magento if:

  1. dostajesz duże worki pieniędzy
  2. musisz
  3. Enjoy pain
 15
Author: Vee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-28 14:26:36

Dziwię się, że nikt nie wspomniał o bazach NoSQL.

Nigdy nie ćwiczyłem NoSQL w kontekście produkcyjnym (po prostu testowałem MongoDB i byłem pod wrażeniem), ale chodzi o to, że NoSQL jest w stanie zapisywać elementy o różnych atrybutach w tym samym "dokumencie".

 15
Author: Lucas T,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-05 23:10:29

Tam, gdzie wydajność nie jest głównym wymogiem, jak w przypadku aplikacji typu ETL, EAV ma inną wyraźną zaletę: zapisywanie różnicowe.

Zaimplementowałem wiele aplikacji, w których wymaganiem nadrzędnym była możliwość zobaczenia historii obiektu domeny od jego pierwszej "wersji" do jego aktualnego stanu. Jeśli obiekt domeny ma dużą liczbę atrybutów, oznacza to, że każda zmiana wymaga wstawienia nowego wiersza do odpowiedniej tabeli (nie aktualizacji, ponieważ historia zostałaby utracona, ale wkładka). Załóżmy, że ten obiekt domeny jest osobą, a ja mam 500k osób do śledzenia ze średnią 100 + zmian w cyklu życia osób do różnych atrybutów. Połącz to z faktem, że rzadko jest to aplikacja, która ma tylko główny obiekt domeny 1, A szybko podejrzewasz, że rozmiar bazy danych szybko wymknie się spod kontroli.

Łatwym rozwiązaniem jest zapisywanie tylko zmian różnicowych w głównych obiektach domeny, a nie wielokrotne zapisywanie zbędnych informacji.

Wszystkie modele zmieniają się w czasie, aby odzwierciedlić nowe potrzeby biznesowe. Kropka. Korzystanie z EAV jest tylko jednym z narzędzi w naszym pudełku, ale nigdy nie powinno być automatycznie klasyfikowane jako"złe".

 11
Author: Jerry Jasperson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-20 13:04:54

Zmagam się z tym samym problemem. Może być dla Ciebie interesujące zapoznanie się z poniższą dyskusją na temat dwóch istniejących rozwiązań ecommerce: Magento (EAV) i Joomla (regularna struktura relacyjna): https://forum.virtuemart.net/index.php?topic=58686.0

Wydaje się, że EAV Magento jest prawdziwym showstopperem.

Dlatego skłaniam się ku znormalizowanej strukturze. Aby przezwyciężyć brak elastyczności, zastanawiam się nad dodaniem osobnych danych słownik w przyszłości (XML lub oddzielne tabele DB), który mógłby być edytowany, a na jego podstawie wygenerowany zostanie kod aplikacji do wyświetlania i porównywania kategorii produktów z nowymi ustawionymi atrybutami, wraz ze skryptami SQL.

Taka Architektura wydaje się być w tym przypadku słodkim punktem - elastycznym i wydajnym jednocześnie.

Problemem może być częste używanie ALTER TABLE w środowisku live. Korzystam z Postgres, więc jego MVCC i transactional DDL, mam nadzieję, że ułatwią ból.

 3
Author: aaimnr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-28 10:04:45

Nadal głosuję za modelowaniem na najniższym poziomie atomowym dla EAV. Niech standardy, technologie i aplikacje, które przekładają się na pewną społeczność użytkowników do decydowania o modelach treści, potrzebach powtórzeń atrybutów, ziaren itp.

 2
Author: Amanda Xu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-07 16:58:43

Jeśli chodzi tylko o atrybuty katalogu produktów, a tym samym wymagania walidacji dla tych atrybutów są raczej ograniczone, jedynym prawdziwym minusem EAV jest wydajność zapytań, a nawet to jest tylko problem, gdy zapytanie dotyczy wielu "rzeczy" (produktów) z atrybutami, wydajność dla zapytania "give me all attributes for the product with id 234" podczas gdy nie jest optymalna jest jeszcze dużo szybka.

Jednym z rozwiązań jest użycie modelu bazy danych SQL / EAV tylko dla administratora / Edytuj stronę katalogu produktów i wykonaj jakiś proces, który denormalizuje produkty w coś, co sprawia, że można je przeszukiwać. Ponieważ masz już atrybuty, a zatem jest raczej prawdopodobne, że chcesz fasetowania, to coś może być Solr lub ElasticSearch. Takie podejście pozwala uniknąć zasadniczo wszystkich wad modelu EAV, a dodatkowa złożoność ogranicza się do serializacji kompletnego produktu do JSON podczas aktualizacji.

 2
Author: bob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-27 18:08:04

EAV ma wiele wad:

    [[3]}degradacja wydajności w czasie Gdy ilość danych w aplikacji przekroczy określony rozmiar, pobieranie i manipulowanie tymi danymi może stać się coraz mniej wydajne.
  1. zapytania SQL są bardzo złożone i trudne do napisania.
  2. Problemy z integralnością danych. Nie można zdefiniować kluczy obcych dla wszystkich wymaganych pól.
  3. musisz zdefiniować i utrzymać własne metadane.
 2
Author: Gabriel Voinea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-06 12:53:41

Mam nieco inny problem: zamiast wielu atrybutów z rzadkimi wartościami (co jest prawdopodobnie dobrym powodem do używania EAV), chcę zapisać coś bardziej jak arkusz kalkulacyjny. Kolumny w arkuszu mogą się zmieniać, ale w arkuszu wszystkie komórki będą zawierały dane (nie są rzadkie).

Zrobiłem mały zestaw testów , aby porównać dwa projekty: jeden za pomocą EAV, a drugi za pomocą tablicy Postgres do przechowywania komórki data.

EAV Tutaj wpisz opis obrazka

Array Tutaj wpisz opis obrazka

Oba Schematy mają indeksy na odpowiednich kolumnach, a indeksy są używane przez planistę.

Okazało się, że schemat oparty na tablicy był o rząd wielkości szybszy zarówno dla wstawek, jak i zapytań. Z szybkich testów wydawało się, że oba skalowane liniowo. Testy nie są zbyt dokładne. Propozycje i widelce mile widziane - są na licencji MIT.

 1
Author: z0r,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-07 05:12:58