Re: Storing multiple items in one MySQL field?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Jan 11, 2012 7:13 AM, "Karl DeSaulniers" <karl@xxxxxxxxxxxxxxx> wrote:
>
>
> On Jan 10, 2012, at 10:49 PM, Karl DeSaulniers wrote:
>
>>
>> On Jan 10, 2012, at 9:30 AM, B. Aerts wrote:
>>
>>> On 08/01/12 23:35, Karl DeSaulniers wrote:
>>>>
>>>>
>>>> On Jan 8, 2012, at 10:36 AM, Bastien wrote:
>>>>
>>>>>
>>>>>
>>>>> On 2012-01-08, at 7:27 AM, Niel Archer <not@xxxxxxxxxx> wrote:
>>>>>
>>>>>>
>>>>>> --
>>>>>> Niel Archer
>>>>>> niel.archer (at) blueyonder.co.uk
>>>>>>>
>>>>>>> Hello phpers and sqlheads,
>>>>>>> If you have a moment, I have a question.
>>>>>>>
>>>>>>> INTRO:
>>>>>>> I am trying to set up categories for a web site.
>>>>>>> Each item can belong to more than one category.
>>>>>>>
>>>>>>> IE: Mens, T-Shirts, Long Sleeve Shirts, etc.. etc..
>>>>>>> (Sorry no fancy box drawing)
>>>>>>>
>>>>>>> QUESTION:
>>>>>>> My question is what would the best way be to store this in one MySQL
>>>>>>> field and how would I read and write with PHP to that field?
>>>>>>> I have thought of enum() but not on the forefront of what that
>>>>>>> actually does and what it is best used for.
>>>>>>> I just know its a type of field that can have multiple items in it.
>>>>>>> Not sure if its what I need.
>>>>>>>
>>>>>>> REASON:
>>>>>>> I just want to be able to query the database with multiple category
>>>>>>> ID's and it check this field and report back if that category is
>>>>>>> present or if there are multiple present.
>>>>>>> Maybe return as a list or an array? I would like to stay away from
>>>>>>> creating multiple fields in my table for this.
>>>>>>
>>>>>>
>>>>>> Have you considered separate tables? Store the categories in one
table
>>>>>> and use a third to store the item and category combination, one row
per
>>>>>> item,category combo. This is a common pattern to manage such
situations.
>>>>>>
>>>>>>> NOTE:
>>>>>>> The categories are retrieved as a number FYI.
>>>>>>>
>>>>>>> Any help/code would be greatly appreciated.
>>>>>>> But a link does just fine for me.
>>>>>>>
>>>>>>> Best Regards,
>>>>>>>
>>>>>>> Karl DeSaulniers
>>>>>>> Design Drumm
>>>>>>> http://designdrumm.com
>>>>>>>
>>>>>>> Hope your all enjoying your 2012!
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> PHP Database Mailing List (http://www.php.net/)
>>>>>> To unsubscribe, visit: http://www.php.net/unsub.php
>>>>>>
>>>>>
>>>>> Neil's solution is the best. Storing a comma separated list will
>>>>> involve using a LIKE search to find your categories. This will result
>>>>> in a full table scan and will be slow when your tables get bigger.
>>>>> Storing them in a join table as Neil suggested removes the need for a
>>>>> like search an will be faster
>>>>>
>>>>> Bastien
>>>>> --
>>>>> PHP Database Mailing List (http://www.php.net/)
>>>>> To unsubscribe, visit: http://www.php.net/unsub.php
>>>>>
>>>>
>>>> Thanks guys for the responses. So.. what your saying if I understand
>>>> correctly.
>>>> Have the categories in one table all in separate fields.
>>>> Than have a the products table. Than have a third table that stores say
>>>> a product id
>>>> and all the individual categories for that product in that table as
>>>> separate fields associated with that product id?
>>>>
>>>> Am I close? Sounds like a good situation, but I didn't want to really
>>>> create a new table.
>>>> One product will probably have no more than 3 combinations of
>>>> categories. So not sure it this is necessary.
>>>>
>>>> EG:
>>>>
>>>> Tshirts = 1
>>>> Jackets = 2
>>>> etc..
>>>>
>>>> Mens = 12
>>>> Womens = 13
>>>>
>>>> So lets say I want to find all the Mens Tshirts.. I was wanting one
>>>> field to hold the 1, 12
>>>>
>>>> hope that clarifies
>>>>
>>>> Karl DeSaulniers
>>>> Design Drumm
>>>> http://designdrumm.com
>>>>
>>>
>>> Hi Karl,
>>>
>>> if you don't want to do with the third-table-solution, how about an
assembler-style bit-wise OR of all categories ?
>>>
>>> constant TSHIRTS = 1 ;  // 2 to the 0th power
>>> constant JACKETS = 2 ;  // 2 to the 1st power
>>> constant MENS    = 8 ;  // 2 to the 3rd power
>>> constant WOMENS  = 16 ; // 2 to the girl power :-)
>>>
>>> INSERT INTO TABLE t_myTable ( ID, categoryField)
>>> VALUES ( myNewId, TSHIRTS | MENS ) ;
>>>
>>> SELECT ID
>>> FROM t_myTable
>>> WHERE  ( categoryField && ( TSHIRTS | MENS )) > 0 ;
>>>
>>> This assumes that your number of categories is not that big of course,
as you're limited to 64 bits/categories on a modern machine.
>>>
>>> Bert
>>>
>>> --
>>> PHP Database Mailing List (http://www.php.net/)
>>> To unsubscribe, visit: http://www.php.net/unsub.php
>>>
>>
>> Hi Bert,
>> Thanks for the response. I did consider that, but there may be more than
64 categories.
>> So I am thinking that may not be best for my situation. I am actually at
the same point again, but
>> this time with the colors. I have multiple colors for each tshirt.
>> I dont want to put all the separate colors as their own fields and there
is an image associated with those colors too.
>> I'd also like to not put those all in separate fields if I can.
>>
>> What's the best way to store multiple values that may change from time
to time?
>> What kind of field?
>>
>> IE:
>> ('red.png', 'green.png', 'blue.png')
>>
>> SET()
>> enum()
>> blob()
>> varchar()
>>
>> ???
>> TIA
>>
>> Karl DeSaulniers
>> Design Drumm
>> http://designdrumm.com
>>
>>
>> --
>> PHP Database Mailing List (http://www.php.net/)
>> To unsubscribe, visit: http://www.php.net/unsub.php
>>
>
>
> I am thinking of limiting the colors to 10 for now (after all there are
only so many ways to die a shirt. =)
> and using a comma delimited list of abbreviated color names as a varchar
string.
> Then read out that string, explode on the commas and put in an array.
>
> `pd_color` varchar(39) CHARACTER SET utf8 NOT NULL DEFAULT
'Blk,Wht,Gry,Tan,Nvy,Red,Grn,Yel,Org,Trq'
>
> With this I can dynamically call each different color file dependent on
what's in the $colors[] array.
> ...
> $colors['Blk,Wht,Gry']
> foreach($colors as $color) {
> ... get color for this iteration
> $product = "Mens_Sample_".$color."_T.png"; //for eg.
> ...
> $image = "http://somewhere.com/images/products/".$product;
>
> and if I want to add colors, I can just change it to how ever many more
characters + commas.
>
> ALTER TABLE...  `pd_color` varchar(55) CHARACTER SET utf8 NOT NULL
DEFAULT 'Blk,Wht,Gry,Tan,Nvy,Red,Grn,Yel,Org,Trq,Brk,Ptr,Sil,Tie'
>
> My thoughts are because it will be a string, it will be read by php out
of MySQL fairly quickly and then php does the rest.
> Am I headed for a headache or is this unconventional but OK or is this
the way to go?

Headache. Either use the MySQL set datatype or use a join table. Your way
is a violation of the first normal form, which is generally a bad idea to
do. Nit to mention slower.

> Best,
>
>
> Karl DeSaulniers
> Design Drumm
> http://designdrumm.com
>
>
>
> --
> PHP Database Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>

[Index of Archives]     [PHP Home]     [PHP Users]     [Postgresql Discussion]     [Kernel Newbies]     [Postgresql]     [Yosemite News]

  Powered by Linux