2010-03-12 4 views
3

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

CREATE TABLE manager 
( 
name char(50), 
worker_1_name(50), 
worker_2_name(50), 
... 
worker_N_name(50) 
); 

Очевидно, что это не идеальный способ создания базы данных. Поскольку я должен разместить самую большую группу, которую потенциально может иметь менеджер, я трачу много места в базе данных. Я бы предпочел иметь таблицу, которую я могу использовать как член другой таблицы (например, я бы сделал в C++ через наследование), которую можно использовать в таблице «manager» для обработки переменного числа сотрудников. Это может выглядеть примерно так.

CREATE TABLE manager 
( 
name char(50), 
underlings WORKERS 
); 

CREATE TABLE WORKERS 
( 
name char(50), 
); 

Я хотел был бы иметь возможность добавить переменное количество работников к каждому менеджеру. Возможно ли это, или я вынужден перечислять все возможное число сотрудников, хотя я буду использовать полный набор только редко?

ответ

1

В общем, вы должны делать что-то вроде следующего:

CREATE TABLE managers ( 
    manager_id int, 
    name  char(50) 
); 

CREATE TABLE workers (
    name  char(50), 
    manager_id int 
); 

Это, как вы должны представлять собой «переменное число рабочих» в relation model.

+0

Это особенно [нормализация базы данных] (http://en.wikipedia.org/wiki/Database_normalization). Он упоминается в этой ссылке ссылки на отношение, но это довольно большая страница, чтобы ее найти. – phazei

0

Вы можете использовать столбец идентификатора, чтобы отслеживать рабочих как записи в одной таблице.

CREATE TABLE manager 
(
name char(50), 
id int 
); 

CREATE TABLE WORKERS 
(
managerID int, 
name char(50) 
); 

Разрешить повторяющиеся managerIDs в рабочий ... если вы хотите, чтобы получить конкретные рабочие к менеджеру, просто выбрать имя из РАБОЧИХ, где ManagerID = ID, и он будет возвращать все рабочие для этого менеджера. Если вам нужны более сложные запросы, вы также можете использовать Joins.

0

Вы могли бы назначить автоинкрементный идентификатор менеджер, и связать рабочий к нему с помощью внешнего ключа:

manager 
    id 
    name 

worker 
    id 
    manager_id 
    name 
0

Вы можете создать промежуточную таблицу отображения. Что-то вроде следующего:

manager(id, name) 
managerWorkerMapping(managerId, workerId) 
worker(id, name) 

Теперь, чтобы получить все рабочие для конкретного менеджера, можно выполнить следующий запрос:

select w.name from worker w, manager m, managerWorkerMapping mwm 
where m.name = 'manager name' and 
     m.id = mwm.managerid and 
     mwm.workerId = w.id 

Важно отметить, что с этой схемой, можно для работников также иметь несколько менеджеров.

0
select w.name from worker w, manager m, managerWorkerMapping mwm 
where m.name = 'manager name' and 
     m.id = mwm.managerid and 
     w.id = mwm.workerId 
+0

Не могли бы вы дать некоторое объяснение, чтобы пойти с этим? Что вы сделали, это принципиально другое и почему это решение для OP? – corsiKa

+0

@cliff - в то время как запрос запроса полезен, подумайте о добавлении этого в существующий ответ. Сам по себе он не отвечает на вопрос, заданный ОП. –

+0

Точный дубликат [другого ответа] (http://stackoverflow.com/a/2433788/1402846). – Pang

Смежные вопросы