Проектирование базы данных в отношении динамических записей - одна строка или несколько строк? - PullRequest
1 голос
/ 04 ноября 2008

Я пытался спроектировать схему базы данных для стороннего проекта, но я не смог создать ничего, что мне удобно. Я использую ASP.Net с LINQ для доступа к данным:

Я собираюсь позволить пользователям указывать до 10 «элементов», каждый из которых имеет 2 числовых свойства и 1 ссылочное свойство, имя элемента.

Если бы я поместил эту запись в 1 строку, она бы легко равнялась примерно 30+ столбцам (минимум), например. item_1_name (ref) item_1_weight item_1_volume item_2_name ... и т.д ...

И я не могу просто превратить эти столбцы в ссылочные таблицы, поскольку каждое свойство может в основном варьироваться от 1 до 400+.

Я также подумал, что если пользователь решит добавить только 1 элемент в свою запись, метод создания объекта для этих данных будет статическим, как в случае с LINQ, мне нужно будет проверить, имеют ли свойства и все такое значение NULL. и работать соответственно. Кроме того, если бы я захотел увеличить количество элементов, разрешенных в записи, работать с ней было бы головной болью.

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

Есть ли что-то, что я упускаю из виду в своем дизайне / есть ли гораздо лучший и эффективный способ сделать это?

РЕДАКТИРОВАТЬ: Когда я говорю, что он будет расти астрономически, я имею в виду это в следующем смысле: пользователь может создать запись, и каждая запись, скорее всего, будет иметь группу элементов. Допустим, они делают 1 вход в день на сайт, они могут иметь 3 группы элементов с максимальным количеством элементов (10), что равняется 30 элементам для этой единственной записи. Делайте запись каждый день в течение недели с такой скоростью, и вы можете иметь 210 строк для этого отдельного пользователя.

Ответы [ 3 ]

2 голосов
/ 04 ноября 2008

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

CREATE TABLE Items (
  user_id               INTEGER NOT NULL,
  item_id               INTEGER NOT NULL DEFAULT 1,
  numeric_property1     INTEGER,
  numeric_property2     INTEGER,
  referential_property  INTEGER,
  PRIMARY KEY (user_id, item_id),
  FOREIGN KEY (user_id) REFERENCES Users(user_id)
                        ON DELETE CASCADE,
  FOREIGN KEY (item_id) REFERENCES num_items(item_id),
  FOREIGN KEY (referential_property) REFERENCES some_other_table(some_column)
);

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

CREATE TABLE num_items (item_id INTEGER NOT NULL );
INSERT INTO num_items (item_id) 
  VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);

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

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

edit: Как говорит Тони Эндрюс в своем ответе, количество строк не является проблемой. Вы не указываете, какую марку базы данных вы собираетесь использовать, но если вы не выберете особенно слабый продукт, такой как MS Access, вы можете положиться на базу данных, чтобы легко обрабатывать миллионы строк. Если вы хорошо выбираете индексы и пишете запросы, использующие эти индексы, эффективность не должна быть проблемой.

0 голосов
/ 04 ноября 2008

Правильный дизайн базы данных будет хранить каждого пользователя / элемента в отдельной строке. С этим будет намного проще работать, и уберется произвольное ограничение в 10 элементов. Я бы не сказал, что он станет «астрономически глубоким», будет около 10 х (количество пользователей) строк.

0 голосов
/ 04 ноября 2008

использовать одну таблицу предметов:

userId, itemIndex, isReference, numericValue, referenceValue

таким образом значение для item_3_name для пользователя 999 преобразуется в

999,3, правда, нулевое значение

Вам придется самостоятельно вводить определенные ограничения, с.а. максимальное количество элементов на пользователя и т. д.

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