Důsledky výkonnosti ORDER BY COALESCE v MySQL

hlasů
2

Můj Obecným problémem je, že chci, aby uživatelé mohli ve skutečnosti přidat libovolný počet polí různých typů spojovat s položkami. Takže jediné řešení Uvažuji je následující:

table `items`
item_id  |  name  

table `parameters`  
parameter_id  |  name  |  type

table `values`  
item_id  |  parameter_id  |  datetimevalue  |  datevalue  |  integervalue  |  etc...

Pokud se uživatel chce přidat parametr „Datum narození“ do některé ze svých předmětů, by přidáme jeden parametr do tabulky parametrů, a pak jeden záznam v tabulce hodnot pro každou položku, která chce mít tento parametr, přičemž datum ubírají DATEVALUE kolony a všechny ostatní ‚hodnoty‘ poli vlevo null.

Pro objednání jeho položky by „Datum narození“, za předpokladu, tento parametr se id_parametru = 1, udělal bych

SELECT * from 
items
join values on items.item_id = values.item_id
join parameters on parameters.parameter_id = values.parameter_id

where parameter_id = 1
order by coalesce(values.datetimevalue, values.datevalue, values.integervalue...)

Moje konkrétní otázka je, bude to ORDER BY být výkonnější? Bude to dobře využít indexů? To bude dělat zbytečnou práci?

Moje obecná otázka je, je tento přístup dobré praxe? Existuje lepší způsob, jak to udělat?

Položena 26/08/2009 v 22:20
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
1

Mluvíš EAV modelování.

Podívejte se na EAV modelování

Odpovězeno 26/08/2009 v 22:28
zdroj uživatelem

hlasů
0

To ORDER BY COALESCE ... nebude moci využít indexu. Je COALESCE důležité? Vypadá to, že pokud se podíváme na jediném parametru, objednávání podle sloupce by mělo stačit, protože všechny hodnoty budou stejného typu.

Tento dotaz by měl být schopen využít indexu na (id_parametru, datetimevalue, DATEVALUE, integervalue), pokud jste právě udělal „ORDER BY datetimevalue, DateValue, integervalue“.

Nevýhody: 1) to vypadá trochu chaotický 2) Pokud máte spoustu sloupců hodnoty a pokud se vaše hodnoty tabulky bude velký, že index jít plýtvat prostor a čte / zapisuje.

Ty by mohly být lépe, kdyby si jen přidat „SORT_ORDER“ (nebo něco podobného) sloupec do tabulkových hodnot a index že místo. Také, pokud budete opravdu potřebovat COALESCE proto, že chcete řadit hodnoty různých typů, můžete si vybrat výpočet SORT_ORDER, který bude dělat správnou věc.

Odpovězeno 03/09/2009 v 05:52
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more