Проектирование реляционных баз данных (MySQL) - PullRequest
0 голосов
/ 08 декабря 2010

У меня есть таблица User, в которой хранится информация о пользователе - например, имя, дата рождения, местонахождение и т. Д.

Я также создал таблицу ссылок с именем User_Options - для хранения атрибутов с несколькими значениями - в ней, в основном, хранятся выбранные флажки.

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

Table User_Attributes
=====================
id    attribute_name
---------------------
1     Hobbies
2     Music
Table User_Attribute_Options
======================================
id    user_attribute_id    option_name 
--------------------------------------
1     1                    Reading
2     1                    Sports
3     1                    Travelling
4     2                    Rock
5     2                    Pop
6     2                    Dance

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

А вот таблицы пользователя:

Table User
========================
id    name           age
------------------------
1     John           25
2     Mark           32
Table User_Options
==================================================
id    user_id         user_attribute_id      value
--------------------------------------------------
1     1               1                      1
2     1               1                      2
3     1               2                      4
4     1               2                      5
5     2               1                      2
6     2               2                      4

(в приведенной выше таблице «user_attribute_id» - это идентификатор родительского атрибута, а «value» - это идентификатор опции атрибута).

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

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

Ответы [ 2 ]

1 голос
/ 08 декабря 2010

Нет ничего плохого в том, как вы это сделали.

Можно сделать вещи более расширяемыми за счет более связанных ссылок на таблицы (и в составе ваших запросов).Также возможно сделать вещи более плоскими, менее расширяемыми и гибкими, но ваши запросы будут выполняться быстрее.

Но, как это обычно бывает, есть несколько способов сделать это.

1 голос
/ 08 декабря 2010

Единственное, что я могу видеть, что я бы изменил, это то, что в таблице сопоставлений User_Options у вас есть идентификатор, который, кажется, не служит цели.Первичным ключом для этой таблицы будут все три столбца, и я не думаю, что вы будете ссылаться на параметры, которые есть у пользователя по идентификатору, - вы получите их по user_id / user_attribute_id.Например, предоставьте мне все пользовательские опции, где user равен 1, а id атрибута пользователя равен 2. Наличие этих записей с уникальным ключом и дополнительным полем кажется посторонним.

Я думаю, в противном случае общая форма таблиц и их взаимосвязисмотрит прямо на меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...