|
|
|
Построение БД "Under Water Rugby"
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Недавно увлекся чтением литературы по БД (проектирование и разработка). И в качестве хорошей практики, получил небольшой "заказ" от своего прежнего начальника (точнее будет просьба). После некоторого обсуждения данного вопроса, остановились на том, что проект будет поделен на 2 части. Первая - построение БД, второе - написания приложения по манипулированию этими данными. Первая часть проекта будет выполняться на Access 2007. Вторая на C#, с использованием ADO .NET (в будущем планирую перейти на LINQ, но это потом, и к делу не относится =) ). Исходя из того, что это первый подобный проект, хотелось бы заручиться поддержкой от профессионалов. Несомненно проектирование БД является сложной задачей, поэтому прошу помочь всех кто будет заинтересован или просто кому есть, что сказать. Можно было продолжать далее в том же духе, но все же перейду непосредственно к самой задаче. Человек который попросил меня об этом, родом из Норвегии, это я к чему, то что проект связан с подводным регби, до сегоднящнего дня не разу не слышал о таком спорте. Но у них там он достаточно популярен, и промежутками в 2 года проводятся турниры. И так не вдаваясь в подробности, попытаюсь кратко описать сами данные которые будут использоваться. Данные о командах - в них содержаться имена, фамилии и номера игроков. Данные о турнире - какие команды участвовали. Данные о игре - общие результаты игры (команды делятся на два цвета - голубой и белый), время события (пеналти, свободный, аут), количество забитых мячей (при чем ведется учет: кто забил, как забил - пенальти или во время игры), количество свободных ударов. Дополнительные данные о игре - имена капитанов, место проведения, победитель, результат. Как видете данных достаточно, что затрудняет саму логику построения БД. И так, я начал с самого начала: 1. Команда участвует в турнире, на мой взгляд здесь связь как М:М. Несколько команд могут участвовать в турнире, и команда может участвовать в нескольких турнирах. Я представляю как связь 1:М, с использованием промежуточной таблицы INVOLVED. Команда (М) - Участвует - Турнир (М). Представление таблиц: Команда (TEAM) - TEAM_ID, TEAM_NAME. связана с таблицей INVOLVED и PLAYER. Турнир (TOURNAMENT) - TOURNAMENT_ID, TOURNAMENT_NAME. связана с таблицей INVOLVED. Участвует (INVOLVED) - ID, TEAM_ID, TOURNAMENT_ID. связана с таблицей TEAM и TOURNAMENT. И здесь сразу вопрос о 1-чном ключе, в каком формате его хранить (number или autonumber)? И еще в таблице INVLOVED - как задать условие при котором атрибуты TEAM_ID + TOURNAMENT_ID не должны повторятся. Допустим я вел информацию, о том что команда 1 участвовала в 1 турнире, так как первичный ключ у меня ID, я могу вести множество подобных записей. Как убечеречься от такого поведения? 2. В команде, есть n-количество игроков, здесь связь 1:М. Команда (1) - Имеет - Игрок (М). Представление таблиц: Команда (TEAM) - TEAM_ID, TEAM_NAME. - связана с таблицей INVOLVED и PLAYER. Игрок (PLAYER) - PLAYER_ID, PLAYER_FNAME, PLAYER_LNAME, TEAM_ID. связана с таблицей TEAM. 3. Здесь небольшая загвостка, команды играют между собой, в какой таблице лучше хранить результат, как представить саму сущность? Команда - Играет - Матч Заранее благодарю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 19:50 |
|
||
|
Построение БД "Under Water Rugby"
|
|||
|---|---|---|---|
|
#18+
Manro Первая часть проекта будет выполняться на Access 2007.Не связываетесь с файл-серверной базой. Конечно есть большой шанс, что ваше творение не взлетит до одновременного доступа по сети множества клиентов, но лучше сразу выбрать обычную клиент-серверную базу. Manro в будущем планирую перейти на LINQ, но это потом, и к делу не относится =) Если не относится то зачем об этом писать? Manro Человек который попросил меня об этом, родом из Норвегии, это я к чему, то что проект связан с подводным регби, до сегоднящнего дня не разу не слышал о таком спорте. Но у них там он достаточно популярен, и промежутками в 2 года проводятся турниры.И это еще зачем нам знать? Для начала почитайте. http://segfault.kiev.ua/smart-questions-ru.html Manro прошу помочь всех кто будет заинтересован или просто кому есть, что сказать.ищите по форуму. Спортивные соревнования обсуждались много раз. Manro И здесь сразу вопрос о 1-чном ключе, в каком формате его хранить (number или autonumber)?Если вы его генерируете сами и потом вставляете то number. autonumber если хотите чтобы СУБД это сделала сама. (и определитесь с терминологией хотя бы отсюда http://ru.wikipedia.org/wiki/Первичный_ключ) Manro Допустим я вел информацию, о том что команда 1 участвовала в 1 турнире, так как первичный ключ у меня ID, я могу вести множество подобных записей. Как убечеречься от такого поведения?Во-первых ID здесь может быть совсем не нужен, во-вторых откройте для себя ограничение уникальности. Manro 3. Здесь небольшая загвостка, команды играют между собой, в какой таблице лучше хранить результат, как представить саму сущность? В таблице матч - кто (команда1, команда2), где, когда, с каким результатом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 21:01 |
|
||
|
Построение БД "Under Water Rugby"
|
|||
|---|---|---|---|
|
#18+
Согласен с вами SERG1257. Хотелось подробнее изложить тему, однако увлекся немного и переборщил. Благодарю за ответы, все четко и ясно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 21:42 |
|
||
|
Построение БД "Under Water Rugby"
|
|||
|---|---|---|---|
|
#18+
SERG1257, В продолжении начатой темы, хотелось бы задать еще пару вопросов. В сущности Команда, я собираюсь добавить новый атрибут под названием Капитан Команды. Сущность Команда связанна с сущностью Игрок как: TEAM: TEAM_ID(PK, FK), TEAM_NAME. PLAYER: PLAYER_ID(PK), PLAYER_FNAME, PLAYER_LNAME, TEAM_ID(FK). - Составной ключ из (PLAYER_ID, TEAM_ID) Вопрос: Можно ли задать условие при котором, пользователь выбирает капитана только из списка игроков доступных в данной команде. Например: Действие 1 - В атрибуте Команда - из списка команд выбрана команда Ххххх... Действие 2 - В атрибуте Капитан Команды, появляется список игроков команды Ххххх... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2012, 13:56 |
|
||
|
Построение БД "Under Water Rugby"
|
|||
|---|---|---|---|
|
#18+
Дополнее к вопросу: Капитан команды - состоит из атрибута PLAYER_FNAME и PLAYER_LNAME: Как реализовать такую структуру: Создать два новых атрибута типа: CAPITAN_TEAM_FNAME; CAPITAN_TEAM_LNAME. Либо обдъединить в 1 один атрибут. По моему было бы лучше с одним атрибутом, у кого есть ответы? Заранее благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2012, 14:52 |
|
||
|
Построение БД "Under Water Rugby"
|
|||
|---|---|---|---|
|
#18+
Manro Вопрос: Можно ли задать условие при котором, пользователь выбирает капитана только из списка игроков доступных в данной команде.Можно. Только у сущности PLAYER первичным ключом оставим таки player_id, но введем ограничение уникальности Код: sql 1. индекс по TEAM_ID нам еще пригодится тогда на таблицу TEAM можно наложить ограничение Код: sql 1. Другой вопрос что мы таким образом прибиваем капитана к команде навечно. В то время как капитан может быть разным от игры к игре. То бишь либо вводить сущность состав_на_игру (id, player_id, team_id, game_id, is_capitan), либо добавить капитанов в сущность матч Код: sql 1. 2. 3. 4. хотя можно добавить капитана в команду как капитана по умолчанию. Далее связь команда игроки как 1:M допустима только для простейшего случая когда игроки не имеют права менять команду (или когда история затирается) Не исключено что потребуется дополнительная таблица для истории игрока Код: sql 1. Manro Капитан команды - состоит из атрибута PLAYER_FNAME и PLAYER_LNAME:Это совсем не в кассу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2012, 18:43 |
|
||
|
Построение БД "Under Water Rugby"
|
|||
|---|---|---|---|
|
#18+
SERG1257, Доброго времени суток. Я практически закончил с БД, правда не совсем уверен в ней. Можно ли будет выслать вам ее на майл? С уважением Manro. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2012, 18:21 |
|
||
|
Построение БД "Under Water Rugby"
|
|||
|---|---|---|---|
|
#18+
ManroSERG1257, Доброго времени суток. Я практически закончил с БД, правда не совсем уверен в ней. Можно ли будет выслать вам ее на майл? С уважением Manro. Для того, чтобы вы могли сказать, что и в каких местах неправильно или нужно изменить. Заранее благодарю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2012, 18:23 |
|
||
|
Построение БД "Under Water Rugby"
|
|||
|---|---|---|---|
|
#18+
Выкладывайте скрипт на создание (create table ...) сюда. Посмотреть сможет больше народа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2012, 19:19 |
|
||
|
Построение БД "Under Water Rugby"
|
|||
|---|---|---|---|
|
#18+
SERG1257, Выложить скрипт не получиться, я использовал стандартный конструктор Micosoft Access 2007. Могу выложить саму ER - диаграмму, но толку от ней я думаю будет не больше, чем если бы я пытался объяснить ситуацию устно. На всякий случай если у вас возникнет желание посмотреть на БД, могу оставить вам свой e-mail. Буду ждать вашего ответа =)...61 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2012, 00:46 |
|
||
|
Построение БД "Under Water Rugby"
|
|||
|---|---|---|---|
|
#18+
Manro Буду ждать вашего ответаПокопайтесь в Аксессе, наверняка рядом с диаграммой есть возможность сгенерировать SQL скрипт. Даже если нет, то сделайте reverse engineering вручную накидав скрипт на создание таблиц, ключей и индексов. Плюс к нему набор важных (часто используемых или критичных по времени) запросов. Я не шарю в Аксессе, но могу поискать в вашей схеме антипаттерны (в просторечии грабли). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2012, 18:09 |
|
||
|
Построение БД "Under Water Rugby"
|
|||
|---|---|---|---|
|
#18+
SERG1257, Добрый день. Я попытался сформулировать основные вопросы, вот они: 1. Первый вопрос по формату времени: как задать формат отображения ввода и показа только мм.сс, где часы игнорируются системой. 2. Сущность GAME связанна с сущностью MATCH отношением 1:М. В атрибуте BLUE_SCORE сущности MATCH, последний результат должен записываться в атрибут BLUE_SCORE сущности GAME. Индексом полем и внешним ключом является номер игры. Выражение SQL примерно такое: Код: sql 1. 2. 3. Однако результат не устраивает. Какое выражение нужно, чтобы для каждой игры был свой BLUE_SCORE. 3. В сущности GAME определенны атрибуты GAME_NUMBER, BLUE TEAM и WHITE TEAM, BLUE_SCORE и WHITE_SCORE, WINNER. Атрибут WINNER, содержит результат команды победителя на основании BLUE_SCORE и WHITE_SCORE. Здесь нужно выражение типа: if (BLUE_SCORE>WHITE_SCORE) WINNER = BLUE_TEAM else WINNER = WHITE_TEAM Как это будет выглядеть на SQL. Заранее спасибо за ответы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2012, 12:21 |
|
||
|
Построение БД "Under Water Rugby"
|
|||
|---|---|---|---|
|
#18+
Во первых я сразу утверждал что в Аксессе не копенгаген, стало быть первый вопрос лучше задать в другом подфоруме Во вторых последний match должен определятся каким либо полем типа match_order. И тут вопрос как умеет Access выражение первый попавшийся (top 1) если умеет тогда Код: sql 1. 2. 3. если не умеет тогда придется выполнить еще один запрос по поиску максимального match_order Код: sql 1. 2. 3. 4. 5. 6. 7. Вынужден напомнить что копирование атрибутов суть денормализация (вы должны не забыть обновить game если изменится что нибудь в match) и имеет свои грабли. авторВ сущности GAME определенны атрибуты GAME_NUMBER, BLUE TEAM и WHITE TEAM, BLUE_SCORE и WHITE_SCORE, WINNER. Как это будет выглядеть на SQL. Когда вы вставляете строку или обновляете ее. insert into game (GAME_NUMBER, BLUE TEAM, WHITE TEAM, BLUE_SCORE, WHITE_SCORE, WINNER) values (GAME_NUMBER, BLUE TEAM, WHITE TEAM, BLUE_SCORE, WHITE_SCORE, case when (BLUE_SCORE>WHITE_SCORE) then BLUE_TEAM else WHITE_TEAM end) или когда обновляете. (не знаю умеет ли case аксесс) А также вы можете это подсчитать в прикладной программе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2012, 18:19 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37673125&tid=1541821]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
142ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 421ms |

| 0 / 0 |
