Hi again Bob,
I know it's not 'proper' database design and I should have
normalized the one-to-many relationships to multiple tables.
However, it was fast and gave me a result which worked quickly
(and up against a mad deadline).
I think you've just identified the most common use of the SET datatype.
In your original posting, you said that a procedural solution
wouldn't scale well. If you database will never be more than 5,000
records, why are you concerned about scalability? Are you planning on
processing a hundred concurrent queries?
I meant scalability in terms of the number of items in the SET
(not the number of rows in the table). For example, consider a
SET field with 26 items -
eg. set_col SET ('A','B','C'. 'Z')
If I wish to find out which values of the SET have been used
at least once, I have to either:
a) Query for each member of the SET and find out which gives a result:
SELECT * FROM my_table WHERE set_col LIKE ('%A%')
SELECT * FROM my_table WHERE set_col LIKE ('%B%')
etc.
b) Select DISTINCT(set_col) and then parse the results
for for each member of the set .. which is a worse method.
I was hoping that since each member of the SET really
represents a number, that there would be some bitwise
operation that would painlessly produce all the members
of the SET that appear at least once.
If not, no worries - I'll redo the database properly
when I get some time.
Thanks again,
chas
Bob wrote:
Sir, the basic problem is that you've violated first normal form,
which states columns should only contain atomic (indivisible) data.
Since you plan to divide up the data in your columns, it's obviously
not indivisible.
My recommendation is to brush up on the first three normal forms and
redesign your tables. There may be a way to do what you want with
MySQL functions, but that will require a lot of processing and slow
your queries down. You'll be back where you started, with a solution
that doesn't scale well.
Chas wrote:
I have a column that is defined as a SET. For simplicity's sake,
let's say the column is defined as:
set_col SET ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'Z')
After entering a few hundred rows, I know that some but not all
values of the SET have been used at least once. How can one work
out which values have been used at least once ?
Doing a SELECT DISTINCT(set_col) on the table might provide
something like this:
A,B,D
A,C,G,N,M,P
C,E,F,H,I,R,S
C,E,G,I
D,F
G,H,L,M,O
etc
But it then requires processing to work out which
values have been used at least once. It's not very
scalable.
Is there a method to retrieve a list of all the values
that have been used at least once ?
-
Before posting, please check:
http://www.mysql.com/manual.php (the manual)
http://lists.mysql.com/ (the list archive)
To request this thread, e-mail [EMAIL PROTECTED]
To unsubscribe, e-mail
[EMAIL PROTECTED]
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php
Know thyself? Absurd direction!
Bubbles bear no introspection. -Khushhal Khan Khatak
-
Before posting, please check:
http://www.mysql.com/manual.php (the manual)
http://lists.mysql.com/ (the list archive)
To request this thread, e-mail [EMAIL PROTECTED]
To unsubscribe, e-mail
[EMAIL PROTECTED]
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php
-
Before posting, please check:
http://www.mysql.com/manual.php (the manual)
http://lists.mysql.com/ (the list archive)
To request this thread, e-mail [EMAIL PROTECTED]
To unsubscribe, e-mail [EMAIL PROTECTED]
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php