MSSQL2008: битовые массивы и побитовые операции + база данных Brainstorm - PullRequest
0 голосов
/ 21 сентября 2009

У меня проблема с кодированием, когда я должен сохранить «заметку» и даты, к которым относится заметка. Подумайте о:

Примечание 1 Привет, сегодня мистер Клиент позвонил, договорившись о встрече 30/8/2009, 31/8/2009, 5/9/2009

Примечание 2 Бизнес как обычно. 30/8/2009

Примечание 3 Ресторан закрыт. 6/9/2009

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

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

> Date Bitmap | Month | Year | Note
> 101..         9       2009   Blah Blah     // applies to 1st and 3rd
> 0001...       10      2009   Blah2         // applies to the 4th
> 100           9       2009   Blah23

Когда пользователь выбирает из списка нескольких дат следующую дату: 1 сентября Он получит Бла Бла и Бла 23. Один объект даты и времени будет повторять заметку или принудительно создавать другую таблицу с внешним ключом.

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

У меня есть роскошь времени в этом проекте, как вы можете сказать.

Но как клиентское приложение RETRIEVE может сказать все заметки для данного набора дат? Есть ли битовые операции в MSSQL? Таким образом, я могу получить все строки, скажем, a '1' в 5-м и 7-м битах в этом двоичном поле ?

Я не могу использовать МЕЖДУ, так как у меня могут быть отдельные даты, которые не находятся в диапазоне или что-то в этом роде. Подумайте о том, чтобы иметь тип данных, где он мог бы представлять любое число от 1 до 31. Вот как я думал о растровом изображении.

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

Я чересчур инженерный, или вы можете мне помочь?

Спасибо за все ваши ответы.

Leo

Ответы [ 3 ]

2 голосов
/ 21 сентября 2009

Да, вы чрезмерно инженерны.

Просто создайте один столбец даты и времени и проиндексируйте его. Если вы хотите разделить дату и время, используйте встроенные функции, такие как datepart ().

Как работает клиентское приложение ПОЛУЧИТЬ, скажем, все заметки для данный набор дат? "

Выполнив запрос с WHERE предложением BETWEEN даты начала и окончания.

Объявите поле «Примечание» как varchar (n) [n до 8000 прим.). Используется только пространство, занятое примечанием, а не максимально определенный размер.

1 голос
/ 21 сентября 2009

Я бы лично разделил это на две таблицы

NOTE
int Id
varchar NoteText

NOTEACTIVITY
int Id
DateTime ActivityDate
int NoteId

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

В качестве альтернативы, если вы уже решили, что ваша идея растрового изображения примечания является правильным способом, тогда рассмотрите возможность хранения номеров дня вместо растрового изображения, чтобы вы могли сохранить '[1] [5] [30]'. Это может упростить выполнение ваших запросов путем поиска строк, содержащих «[5]» в этом столбце, например

1 голос
/ 21 сентября 2009

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

Если бизнес-заметка для заметки такова, что может занимать дни, вашей таблице NOTES нужны столбцы EFFECTIVE_DATE и EXPIRY_DATE DateTime. Даты могут быть в тот же день или пара отдельно.

Если вы хотите, чтобы текст / тело заметки применялись к периодическим дням (например, 1 января, 13, 21), вам потребуются две таблицы: NOTES и NOTE_ACTIVITY. NOTE_ACTIVITY будет содержать note_id вместе с датами вступления в силу и сроком действия. Я просто не понимаю, как вы могли бы поддерживать случайные даты, связанные с одним текстом, любым другим способом в базе данных.

...