Как мне нормализовать мою текущую структуру базы данных - PullRequest
1 голос
/ 12 декабря 2011

У меня болит голова, чтобы получить правильный результат при использовании FIND_IN_SET или LIKE.

Пример моего значения в базе данных: 1,2,3,4,5,6,7,8.

Допустим, у меня есть одна форма со многими флажками. Каждый флажок идет с динамическим значением, которое могут добавлять пользователи. Пример значения цвета и имеет green, yellow, white, black, red, pink, brown, etc...

Моя текущая структура tbl_colors & tbl_users

color_id  color_name
----------------------
1         yellow
2         black
3         green
.         ...
.         ...
20        pink

tbl_users

user_id  color_id
----------------------
1         1,2,3,4
2         3,4,5,6,8,9,10
3         1
.         ...
.         ...
20        1,10,20

Вопрос

Как мне нормализовать и реструктурировать мою текущую базу данных выше и как мне подсчитать, сколько пользователей любят желтый цвет, коричневый цвет и т. Д.

Ответы [ 5 ]

1 голос
/ 12 декабря 2011

Взгляните на следующие ссылки:

http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/

http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html

Затем спроектируйте свою схему примерно так (опущена ссылочная целостность):

drop table if exists users;
create table users
(
user_id int unsigned not null auto_increment primary key,
username varchar(32) unique not null
)
engine=innodb;

drop table if exists colours;
create table colours
(
colour_id smallint unsigned not null auto_increment primary key,
name varchar(255) unique not null,
user_counter int unsigned not null default 0
)
engine=innodb;

drop table if exists user_colours;
create table user_colours
(
user_id int unsigned not null,
colour_id smallint unsigned not null,
primary key (user_id, colour_id) -- note the clustered composite primary key
)
engine=innodb;

delimiter #

create trigger user_colours_after_ins_trig after insert on user_colours
for each row
begin
 update colours set user_counter = user_counter + 1 where colour_id = new.colour_id;
end#

delimiter ;


insert into users (username) values ('alpha'),('beta'),('delta'),('gamma');

insert into colours (name) values ('red'),('green'),('blue');

insert into user_colours (user_id, colour_id) values
(1,1),(1,3),
(2,1),(2,2),(2,3),
(4,3);

select * from users;
+---------+----------+
| user_id | username |
+---------+----------+
|       1 | alpha    |
|       2 | beta     |
|       3 | delta    |
|       4 | gamma    |
+---------+----------+
4 rows in set (0.00 sec)

select * from colours;
+-----------+-------+--------------+
| colour_id | name  | user_counter |
+-----------+-------+--------------+
|         1 | red   |            2 |
|         2 | green |            1 |
|         3 | blue  |            3 |
+-----------+-------+--------------+
3 rows in set (0.00 sec)

select * from user_colours;    
+---------+-----------+
| user_id | colour_id |
+---------+-----------+
|       1 |         1 |
|       1 |         3 |
|       2 |         1 |
|       2 |         2 |
|       2 |         3 |
|       4 |         3 |
+---------+-----------+
6 rows in set (0.00 sec)
1 голос
/ 12 декабря 2011

отношение ко многим

tbl_user_color
id, user_id,    color_id
--------------------
1   1   1
2   1   2
3   1   3
4   1   4
5   3   1
6   20  1
7   20  10
8   20  20
...
1 голос
/ 12 декабря 2011

Поместите ПОЛЬЗОВАТЕЛЬ в его / ее собственную таблицу, затем запишите их предпочтения в USER_COLOUR, например,

User ID    Colour ID
1          10
1          11
1          15
2          10
2          7

Обратите внимание на повторяющиеся вхождения идентификатора пользователя и идентификатора цвета.Это называется отношением многие ко многим , поскольку одному пользователю может нравиться много цветов, а многим может понравиться каждый цвет.

1 голос
/ 12 декабря 2011
table colors
id
color_id
color_name

table users
id

table user_color( or whatever )
id
user_id
color_id

Таким образом, у вас есть отдельная таблица и одна запись для каждого выбранного пользователем цвета вместо нескольких чисел в строке color_id. Затем вы можете просто посчитать количество строк, возвращаемых на основе color_id в запросе. Вот как бы я это сделал.

1 голос
/ 12 декабря 2011

вам нужна дополнительная таблица ссылок.

tbl_colors
----------
color_id
color_name 

tbl_users
---------
user_id
...

tbl_users_colors_link
---------------------
user_id
color_id

Обратите внимание, что таблица ссылок не должна содержать уникальных полей.Также не требуется первичный ключ.Только индексирование полей идентификаторов имеет смысл.

...