0

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

Примечание 1 Привет, сегодня г-н Клиент позвонил, организовав эти встречи. 30/8/2009, 31/8/2009, 05/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 сентября Он получит Бла Бла и Blah23. Один объект времени даты будет повторять заметку или принудительно создать другую таблицу с внешним ключом.

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

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

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

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

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

Могу ли я мне помочь?

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

Leo

+0

Привет, ребята, большое спасибо за ваши ответы, но я все еще немного смущен. Эта глупая «заметка» может применяться к одному или нескольким. Они могут быть диапазоном или распространением, не имеет значения. Я ищу метод, который не будет дублировать. Если у меня есть один столбец dateTime, это займет две таблицы. Мой клиент сумасшедший и хочет все это в одной таблице. Вот почему я подумал о растровом изображении, вместо того, чтобы иметь текстовое поле, в котором перечислены даты. –

+2

Клиент не всегда прав. Спросите их, почему они хотят все в одной таблице. –

+1

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

ответ

1

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

NOTE 
int Id 
varchar NoteText 

NOTEACTIVITY 
int Id 
DateTime ActivityDate 
int NoteId 

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

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

2

Да, вы переоценены.

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

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

Выполнение запроса с пометкой WHEREBETWEEN начальные и конечные даты.

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

+1

Насколько я понимаю, я также рассмотрел тот факт, что система примечаний будет очень большой, иногда с заметками, касающимися более 60 дней. То, что вы говорите, имеет 60 записей с тем же 255-байтовым примечанием. –

+2

@Leo, нет, вы не захотите повторять одну и ту же ноту для каждой даты. У вас будет другая таблица, в которой будет храниться штамп даты и времени вместе с внешним ключом в таблице заметок. Таким образом, вы можете найти все даты, относящиеся к заметке, и все примечания, относящиеся к дате. Будет запись этой таблицы для каждой заметки для каждой даты. –

+0

Будет ли отметка времени даты указывать несколько наборов дат, например, 4-й, 6-й и т. Д. (Не диапазон) Мои искренние извинения за то, что вы так критичны. –

1

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

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

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

+0

Мне в основном нужны некоторые заметки, в которых говорится: «В июне бла-бла». эта заметка будет применяться к каждому дню июня. Если в клиентском приложении они ищут 4 июня, эта заметка появится, а также еще одно примечание, которое относится, скажем, к 4-м и 6-му, или к другому только для 4-го. –

+0

Rexem, мои извинения за то, что я над критикой. Я понимаю, что ваш метод будет работать в случае диапазона? Как насчет даты здесь и там? Спасибо - я, вероятно, вызывают гнев, но это вызвало у меня много головных болей, потому что я тоже слишком критический! –