2012-06-26 3 views
0

Я создаю инструмент для изучения, и я не уверен, как лучше всего организовать структурирование моей базы данных.Настройка Mysql для нескольких пользователей с большим количеством отдельных опций

В принципе, у меня есть простая, но большая таблица с около 50000 бит информации в ней.

информация (50'000 строк)

идентификатор info_text

пользователь

идентификатор имя электронной почты пароль т.д.

Что я хочу для студентов, чтобы быть в состоянии пометить каждый предмет как изученный или изучаемый (в основном вкл. и выкл.), чтобы они могли отмечать каждый элемент, когда у них есть r это вызвало.

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

В данный момент я склоняюсь к тому, чтобы иметь только одну огромную таблицу с двумя первичными ключами с идентификатором пользователя, а затем с идентификатором информации, которую они изучали, а затем выполнял какую-то инструкцию JOIN, поэтому я мог только отбросить элементы, которые они уехали учиться.

user_info

user_id info_id

Спасибо заранее

+0

Есть ли у вас группы предметов, которые будут использоваться несколькими пользователями, или будут изучаться так, чтобы изучаемые предметы были настолько разнообразны между пользователями, что нет никакой цели в их объединении? –

+0

Привет, Бранко, спасибо, что ответили. Я не уверен, что я следую за вами, но в основном это простой список предложений для каждого учащегося, который будет изучать, по своему усмотрению. Список исправлен и не будет отличаться от пользователя к пользователю. Для каждого предмета (или его 50 000) необходимы только отношения, которые должны изучаться или не изучаться индивидуально для каждого ученика. – Rob

+0

Итак, все студенты всегда изучают все предметы? –

ответ

0

Вот один из способов моделирования этой ситуации:

enter image description here

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

  • Пользователя (с данным USER_ID) изучил конкретный элемент (с данной item_id) только тогда, когда имеется соответствующая строка в таблице Изученной (с этим же USER_ID и значениями item_id).
  • И наоборот, пользователь не изучил элемент, если и только если соответствующая строка в STUDIED отсутствует.Для того, чтобы вывести все элементы данный пользователь не изученные, вы можете сделать что-то вроде этого:

    SELECT * FROM ITEM 
    WHERE NOT EXISTS (
        SELECT * FROM STUDIED 
        WHERE 
         USER_ID = <given_user_id> 
         AND ITEM.ITEM_ID = STUDIED.ITEM_ID 
    ) 
    

    Или, наоборот:

    SELECT ITEM.* 
    FROM ITEM LEFT JOIN STUDIED ON ITEM.ITEM_ID = STUDIED.ITEM_ID 
    WHERE USER_ID = <given_user_id> AND STUDIED.ITEM_ID IS NULL 
    

Хорошая вещь об этой конструкции является то, что вы не Не нужно заботиться о STUDIED таблице заранее. При добавлении нового пользователя или элемента просто оставляйте STUDIED в покое - вы постепенно его заполняете позже, когда пользователи будут продвигаться с учебой.

+0

привет Бранко, спасибо за отличный ответ. Это то решение, о котором я думал. Меня беспокоило, что размер изученной таблицы станет очень большой, очень быстро. Будет ли этот эффект работать массово или может MYSQL справиться с этим. – Rob

+0

@everythingbeforethebutis ... Да, он станет большим, но базы данных созданы для эффективного управления огромными объемами данных. Помните, что нет волшебства. Каждая часть информации должна быть физически сохранена _somehow_, и это в значительной степени самый компактный _relational_ способ сделать это. Индексы должны обеспечивать хорошую производительность даже на миллиардах строк. Существуют нереляционные хаки, которые _might_ сохраняют ваше пространство, но также будут компрометировать целостность данных и, возможно, производительность, поэтому я настоятельно рекомендую против них. –

+0

безупречное спасибо: – Rob

0

Я хотел бы сделать что-то вроде этого:

1) пользователи таблица с UID первичного ключа

2) Зачисленный стол (в этой таблице показаны все курсы, в которых участвовали учащиеся) с первичным ключом (uid, cid)

3) элементы (информация) таблица держит все предметы для изучения, с первичным ключом ItemID

Затем в зачислен таблице есть только один атрибут (двоичный флаг) 1 означает, что он был studyed и 0 означает, что им все еще нужно изучать его.

+0

, но его не только один курс (один включен и выключен). Мне нужно, чтобы у них был двоичный флаг для каждого из 50000 фрагментов информации. Спасибо за ваше время – Rob

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