MySQL - перейти от плоской таблицы к первой нормальной форме - PullRequest
2 голосов
/ 11 августа 2010

Я создаю приложение, которое позволит пользователю записывать еженедельные действия в течение 6 недель.Каждая неделя имеет 3 контрольных показателя для записи, вот пример:

Week 1

+------------+-----------+------------+-----------+
| Day        | Minutes   | Location   | Miles     | 
+------------+-----------+------------+-----------+
| Monday     |           |            |           |
+------------+-----------+------------+-----------+
| Tuesday    |           |            |           |
+------------+-----------+------------+-----------+
| Wednesday  |           |            |           |
+------------+-----------+------------+-----------+
| Thursday   |           |            |           |
+------------+-----------+------------+-----------+
| Friday     |           |            |           |
+------------+-----------+------------+-----------+
| Saturday   |           |            |           |
+------------+-----------+------------+-----------+
| Sunday     |           |            |           |
+------------+-----------+------------+-----------+

Это повторяется для каждой недели до 6.

В моей плоской таблице у меня есть следующее:

UserID |Имя пользователяНеделя 1 день 1 минута |Неделя 1 день 1 Местоположение |Неделя 1 день 1 миля |Неделя 1 день 2 минуты |Неделя 1 день 2 Местоположение |Неделя 1 день 2 мили ETC ...

X 7 в течение недели, а затем X 6 в течение 6 недель.

Я пытаюсь выяснить, где находятся мои исключения и каковы мои отдельныетаблицы будут.Пока у меня есть следующее:

User Table 
+------------+-----------+
| UserID     | Username  |
+------------+-----------+
|            |           |
+------------+-----------+

Activity Table
+------------+-----------+------------+-----------+------------+-----------+
| UserID     | WeekID    | Day        | Minutes   | Location   |   Miles   |
+------------+-----------+------------+-----------+------------+-----------+
|            |           |            |           |            |           |
+------------+-----------+------------+-----------+------------+-----------+

Weeks Table
+------------+-----------+------------+
| UserID     | WeekID    | Week_No    |
+------------+-----------+------------+
|            |           |            |
+------------+-----------+------------+

Я думаю, что я иду по правильному пути, но таблица недель кажется неправильной, и я не уверен, каковы отношения - я не думаю,Мне нужен UserID в каждой таблице, и я не уверен, какими должны быть PK.

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

РЕДАКТИРОВАТЬ:

Большое спасибо за все ответы, отличные вещи.

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

Пересмотр схемы:

User Table - UserID PK
+------------+-----------+
| UserID     | Username  |
+------------+-----------+
|            |           |
+------------+-----------+

Activity Table - ActivityID PK
+------------+-----------+------------+-----------+------------+-------------+-----------+
| ActivityID | UserID    | Week_No    | Day       | Minutes    | LocationID  |   Miles   |
+------------+-----------+------------+-----------+------------+-------------+-----------+
|            |           |            |           |            |             |           |
+------------+-----------+------------+-----------+------------+-------------+-----------+

Location Table - LocationID PK
+------------+---------------+
| LocationID | Location_Name |
+------------+---------------+
|            |               |
+------------+---------------+

2-е РЕДАКТИРОВАНИЕ:

Теперь у меня есть вопрос о 2NF и 3NF по этой теме:

MySQL - переход от 1-й нормальной формы к 2-й и 3-й нормальной формам

Ответы [ 4 ]

1 голос
/ 11 августа 2010

В таблице недель ваш первичный ключ должен быть WeekID. Я не уверен, что вам понадобится недельный стол, так как вы, похоже, ничего не храните в нем, кроме недели, в которой происходило мероприятие, которое на самом деле может быть в таблице активности. Поэтому я бы избавился от этого, добавил Week_No в таблицу Activity и в качестве основного идентификатора указывал ActivityID, а в качестве ключа Foriegn - UserID.

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

1 голос
/ 11 августа 2010

Добавьте таблицу Location и измените Location на LocationID (PK). Таблица Weeks не нуждается в UserID. Вы можете узнать, сколько недель у пользователя, запросив таблицу Activity.

Я вижу необходимость в таблице Week, только если Week_No изменяется пользователем, что, кажется, не имеет особого смысла. В противном случае вы можете просто заменить WeekID на WeekNo в таблице Activity и удалить таблицу Weeks.

0 голосов
/ 11 августа 2010

я не думаю, что вам нужен недельный стол.

таблица активности с идентификатором пользователя, именем недели, днем ​​(перечислением), минутами, местоположением, милями - достаточно для того, что вы упомянули ...

0 голосов
/ 11 августа 2010

PKs: Пользователь tbl: UserID Weeks tbl: WeekId Activity tbl: (UserID, WeekID)

И вам не нужен UserId в течение недель Tbl

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