2012-02-21 5 views
0

Это очень сложный вопрос. Я попытался, но я не нашел того, что искал.Настройка конфигурации таблицы SQL Server

Я попытаюсь объяснить это как можно лучше.

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

У меня есть несколько пользователей в базе данных, и я пытаюсь настроить «тесты» для каждого пользователя. Каждый пользователь может иметь теоретически бесконечное количество тестов (хотя на самом деле это почти всегда меньше 5, но я не хочу ограничивать себя этим), и каждый тест может иметь другой набор значений для каждого движения вперед и управления оценивает ориентиры на предстоящие 3-4 года. Это означает, что каждый год будет достигнуто другое контрольное значение.

Вот пример.

Человек А

Benchmark 1: 2010, 2011, 2012, 2013, 2014, 2015 
Benchmark 2: 2010, 2011, 2012, 2013, 2014, 2015 

так далее и так далее для каждого пользователя и каждого теста.

Мой вопрос заключается в следующем:

  • Как я должен настроить таблицы для этого?

Вариант 1: Настройка эталонного таблицу, которая имеет отношение к пользователю и столбцам для каждого года. Мне нужно было бы обновлять базу данных каждый год и добавлять еще один столбец для нового года, и он может расти из-под контроля в течение очень длительного периода времени.

Вариант 2: Настройте таблицу для имен тестов с отношением к пользователю, таблицу с годами и таблицу с эталонными данными, которые имеют отношение к эталону и году? Это похоже на лучший подход для обслуживания, но это также означает, что одно и то же имя теста будет существовать несколько раз, но с другим годом и стоимостью. Мне не нужно было бы добавлять колонку в течение нового года, просто убедитесь, что год существует в таблице лет.

Вариант 3: Что-то, что вы, ребята, говорите мне, является лучшим вариантом? Я надеюсь.

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

ответ

3

Вариант 2, вероятно, прекрасен. Это будет очень быстро и намного более ремонтопригодным. Если вы беспокоитесь о повторяющихся тестов имен, можно разделить, что слишком, так что вы в конечном итоге с:

benchmark_names(benchmark_id, name) 
benchmarks(benchmark_id, user_id, year, value) 

Примечание: В таблице benchmark_names предположительно будет очень мало (сравнительно), поэтому дополнительные присоединиться должно быть довольно и это может даже помочь производительности с большим набором данных, поскольку идентификатор теста обычно занимает меньше памяти, чем имя.

+0

Я не вижу цели вашей таблицы usersXbenchmarks. Для этой цели служит user_id в таблице контрольных показателей. – Bill

+0

@Bill - Хорошая точка. –

1

Почему не просто столбец идентификатора пользователя, контрольного имени, года и стоимости?Что-то вроде:

user_id | bm_name | bm_year | value 
1234 | "SomeBM" | 2001 | 5 
1234 | "SomeBM" | 2002 | 6 
1234 | "SomeBM" | 2003 | 7 
1234 | "SomeBM" | 2004 | 8 

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

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