2013-03-09 2 views
0

Я разрабатываю веб-приложение и нуждаюсь в некоторой рекомендации по организации информации о базе данных. Ниже приведен список всех данных приложение будет иметь:Как мне организовать несколько таблиц в MySQL

1) Там будут пользователи, которые будут храниться в таблице, как так:

User 
- username (primary key) 
- email 

2) Пользователи могут создавать карты (которые представлены в виде таблицы, как так)

Map 
- name 
- data 

Пользователи могут создавать много карт

Использование базы данных MySql, как я должен получить систему хранения, как я описал выше:

  • Должен ли я иметь один стол, который хранит карты всех пользователей? Затем создайте новое поле «имя пользователя» в таблице «Карта».
  • Должен ли я создать новую таблицу карт для каждого нового пользователя, который хранит только эти карты пользователей.
  • Должен ли я создать новое поле «maps» в пользователе, а затем связать его с таблицей «Карта»?

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

+0

и эти карты могут использоваться многими пользователями или нет? –

+0

Пользователи создают свои собственные карты, к которым только они будут иметь доступ. Некоторые пользователи не могут создавать карты, но у всех пользователей есть возможность создавать карты. –

ответ

1

Поскольку у вас есть упоминания, что пользователи могут создавать множество карт, я думаю, вам нужно всего лишь две таблицы для этого (не много карт таблиц для каждого пользователя)

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

  • USERID (Первичный ключ)
  • имя_пользователя (уникальный)
  • электронной

Карта

  • ID (Первичный ключ)
  • имя
  • Дата
  • идентификатор пользователя (внешнего ключа)

когда tranlated в DDL:

CREATE TABLE User 
(
    UserID INT AUTO_INCREMENT, 
    UserName VARCHAR(15), 
    Email VARCHAR(35), 
    CONSTRAINT usr_pk PRIMARY KEY(UserID), 
    CONSTRAINT usr_uq UNIQUE(UserName) 
); 

CREATE TABLE Maps 
(
    MapID INT AUTO_INCREMENT, 
    Name VARCHAR(20), 
    Date DATETIME, 
    UserID INT, 
    CONSTRAINT map_pk PRIMARY KEY(MapID), 
    CONSTRAINT map_FK FOREIGN KEY(UserID) REFERENCES User(UserID) 
); 

, когда вы хотите, чтобы получить все карты для всех пользователей,

SELECT a.*, b.Name 
FROM User a 
     INNER JOIN Maps b 
      ON a.UserID = b.UserID 

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

+0

Я правильно понял, что столы должны быть InnoDB? –

+0

@JamieFearon 'INNODB', конечно. 'MyISAM' не поддерживает отношения. –

+0

Когда я запускаю эти два запроса в phpmyadmin, он успешно создает таблицы, но таблица MyISAM. Если я вручную изменю их на INNODB на вкладке операций, то все будет в порядке? –

1

Do not создайте новую таблицу для каждого пользователя для карт. Это будет кошмар для поддержания, и вы потеряете контроль над нормализацией. Аналогичные комментарии относятся к пункту № 3 (новый столбец maps для каждой пользовательской карты).

Сделайте свой первый балл: добавьте имя пользователя на maps. Затем вы можете иметь одну таблицу для карт и создавать как можно больше карт для каждого пользователя. Я бы сделал еще один шаг и добавлю столбец «user ID» , который ссылается на карты (имена пользователей могут измениться после всех - и все равно должны быть уникальными). Карта также должна иметь свой собственный столбец идентификатора auto_increment. Это называется «суррогатным ключом».

SELECT data FROM Map JOIN User USING(userID) WHERE userID = ? 
+0

Благодарим вас, что будем вызывать SELECT data FROM Map JOIN User USING (userID) WHERE userID = foo возвращает только возвращаемые карты, которые принадлежат идентификатору пользователя –

+0

@JamieFearon, который является правильным –

+0

Я правильно понял, что ваше решение не требует создания внешних ключей как это делает решение JW? –

0

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

Тогда вы говорите о связи между пользователями картографической, так что вы можете назвать эту таблицу UserMapRelationship или просто UsersMap

Это один будет держать рк для обоего таблиц и, вероятно информации, относящейся к этим отношениям.

Надеюсь, что это помогло.

Спасибо!

@leo.

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