|
|
|
Как лучше организовать структуру таблицы?
|
|||
|---|---|---|---|
|
#18+
Hi ALL! Вот такой вот вопросик, на который хотелось бы получить ответ столкнувшихся с этим или подобным. Есть 10 (примерно) офиссов. В каждом будет стоять база. Требуется в одном оффисе собирать полную базу (из всех тех 10). Для этого в некоторых таблицах требуется ввести номер оффиса, т.к. если просто поставить автоинкрементный ID, то при слиянии баз они будут заменяться друг на друга (перекрываться друг другом). А из других таблиц требуется ссылаться именно на те, которые относятся к своему офису. Т.е. как я понимаю необходимо номер оффиса вставить в первичный ключ. Теперь видно два выхода из положения. Первый - сделать первичный ключ составным из двух полей, т.е. автоинкрементное ID и номер офиса. Второй - сделать поле первичного ключа одним полем, и в тригере прописывать в него номер оффиса (например в старший байт) и самому увеличивать. Есть ли еще идеи? И как лучше сделать? Процедуру по получению ID я написал... она возвращает ID которое необходимо вставить (в котором уже учитывается номер оффиса). Но т.к. у меня пока не очень большая практика использования SQL Servera меня мучают сомнения: Может все это можно сделать проще??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2002, 12:23:19 |
|
||
|
Как лучше организовать структуру таблицы?
|
|||
|---|---|---|---|
|
#18+
А такой вариант не пойдет ? IDENTITY [ ( seed , increment ) ] В Филиале 1 у таблицы : seed=10000 Филиал 2: seed=20000,increment=1 ...... Филиал 9: seed=90000 Если я правильно понял о чем идет речь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2002, 13:17:06 |
|
||
|
Как лучше организовать структуру таблицы?
|
|||
|---|---|---|---|
|
#18+
Можно в качестве ID использовать uniqueidentifier. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2002, 13:23:31 |
|
||
|
Как лучше организовать структуру таблицы?
|
|||
|---|---|---|---|
|
#18+
Такой вариант приемлим, но не для данной задачи... т.к. изначально неизвестно кол-во офисов и оно может изменятся. также записей в таблице будет намного больше чем 10000 для офиса... и наконец офисов может быть много... но где то до 256.... я думаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2002, 13:24:57 |
|
||
|
Как лучше организовать структуру таблицы?
|
|||
|---|---|---|---|
|
#18+
GUID ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2002, 13:25:03 |
|
||
|
Как лучше организовать структуру таблицы?
|
|||
|---|---|---|---|
|
#18+
2 SergSuper: GUID нельзя, т.к. в центральном офисе может понадобится просмотр каких либо данных именно по конкретному офису... хотя конечно можно в таблицу вставить поле с номером офиса... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2002, 13:33:15 |
|
||
|
Как лучше организовать структуру таблицы?
|
|||
|---|---|---|---|
|
#18+
Тогда я что-то не понимаю. может быть 256 филиалов... записей может быть больше 10000... Может и база будет не MSSQL ? Нужна конкретная постановка задачи если это вообще возможно в форуме. Если софт не сторонней фирмы а Ваш собсвенный что мешает ввести поле BranchID и весь вопрос... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2002, 13:41:42 |
|
||
|
Как лучше организовать структуру таблицы?
|
|||
|---|---|---|---|
|
#18+
2 Ипатько Игорь: Хочется сделать универсальное ПО. по этому поводу нельзя придерживатся только какогото постоянного значения... ведь все всегда идет наихудшим путем! :о) А насчет BranchID... это что такое? объясни плиз... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2002, 13:50:18 |
|
||
|
Как лучше организовать структуру таблицы?
|
|||
|---|---|---|---|
|
#18+
Сделай просто: 1. Primary key на два поля ID, Office_ID - тогда писать одинаковые ID для разных офисов можно, а для одного нет. ну ID будет не Identity... 2. Или тоже подойдёт " Филиал 1: seed=10000 Филиал 2: seed=20000 ...... Филиал 9: seed=90000 " только с шагом = 10.000.000 - думаю когда закончаться, надо будет уже в архив клать. ну ID тоже будет не Identity... Живите спокойно. ProgramMaster@yandex.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2002, 13:53:54 |
|
||
|
Как лучше организовать структуру таблицы?
|
|||
|---|---|---|---|
|
#18+
Из всего выше сказанного, как я понимаю, является вот что: ID в таблице имеет тип uniqueidentifier и плюс добавляется в таблицу поле с номером офиса. Что удобно в использовании (т.к. ссылаться из других таблиц на таблицу по двум полям, которые образуют первичный ключ как то не очень удобно), более быстродейственней (т.к. кодирование номера офиса в ID, а потом разкодирование его и сравнение в случае надобности думаю будет выполнятся медленее, особенно при больших объемах данных, чем просто обычное сравнение поля с номером офиса) и по моему выглядет более изящно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2002, 14:40:15 |
|
||
|
Как лучше организовать структуру таблицы?
|
|||
|---|---|---|---|
|
#18+
В свое время я тоже мудрил над этой проблемой. Сиды и последовательная нумерация записей - это не есть хорошо. Действительно, наиболее хорошим решением является именно GUID (uniqueidentifier). А почему все остальное не есть хорошо, я объясню. Если хотя бы один раз в жизни возникнет такая ситуация, что информация вносится в офисе M, а модифицируется в офисе N, вся твоя схема с обменом данными между офисами летит к чертовой матери (пардон за фольклорные руссонизмы). Ибо для синхронизации данных не достаточно информации о том, в каком офисе она вводилась. Еще нужна информация о том, где она в последний раз изменялась (а самый крантовый вариант - когда она изменяется одновременно и везде). И это даже не есть самое поганое. Допустим, что в офисе N ничего никогда не модифицируется, просто скачивается информация офиса M. Теперь представь, что в самам офисе M кто-нибудю взял и просто удалил, либо изменил одну запись (которая ранее уже была передана в офис M). Каким образом сервер должен догадаться, что именно эту запись ему нужно удалить и перекачать повторно, а все остальные не трогать? Теперь о том, почему Uniqueidentifier - это хорошо. 1. На этот тип завязаны стандартные механизмы репликации. 2. GUID генерится гарантировано уникальным, что при любых раскладах исключает конфликты формирования идентификаторов. 3. 16-байтовость GUIDов делает их поистине неисчерпаемыми по сравнению с идентификаторами малого размера с последовательной нумерацией, использование которых потенциально опасно переполнением разрядной сетки (особливо в совокупности с разбиентием интервалов с помощью SID). Остается вопрос - как же отличить те записи, которые должны передаваться после модификации/удаления/добавления из одного офиса в другой? Во-первых, рпешение этих вопросов можно поручить стандартным механизмам репликации. Во-вторых, можно завести дополнительные поля. Если тебе позарез нужно знать "место рождения" записи (именно рождения, а не модификации!), то заведи такое поле. Если тебе нужно знать именно место модификации, то заведи соответствующее поле. Если тебе еще нужно знать дату/время последней модификации, заведи еще и такое поле. Вот только с удалением может возникнуть проблема. Дело в том, что все вспомогательные поля несут какую-то информацию только по тем записям, которые реально существуют в природе. А вот если запись удалили, то она больше не существует. И информацию о том, почему данная запись перестала существовать, кто или что стало причиной ее удаления - в простой структуре уже не разложишь. Нужно вести журнализацию операций. А там возникает вопрос, до какого века какой эры эта журнализация должна жить и что в ней существенно, а что нет (может оказаться, что существенно всё, но очень редко, а записи создаются и удалаяются сотнями каждую минуту). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2002, 17:48:01 |
|
||
|
Как лучше организовать структуру таблицы?
|
|||
|---|---|---|---|
|
#18+
Судя по постановке вопроса, двух полей OfficeID например tinyint, RecordID - составляющих первичный ключ должно быть достаточно. Ведь насколько я понимаю, данные не будут изменяться в том оффисе, где данные собираются. Да они и не должны там изменяться. В противном случае возникает несинхронизированность данных, которую не решить никакими способами. Всегда должно присетствовать отношение master-slave, не может быть иначе. GUID - тоже решение, но худшее в данном случае, ибо сразу вырастает размер строки и размер первичного ключа. А как следствие - вырастают размеры и foreign keys и так далее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2002, 19:46:21 |
|
||
|
Как лучше организовать структуру таблицы?
|
|||
|---|---|---|---|
|
#18+
Вопрос к Garya: Вы пишите "...Действительно, наиболее хорошим решением является именно GUID (uniqueidentifier)." То есть первичным ключом таблиц должно быть поле типа uniqueidentifier и PRIMARY index по нему кластерный или некластерный??? Если так, то насчёт разрешения проблем репликации я с Вами соглашусь, но потеря скорости же будет, наверное, серьёзная. (При больших миллионых объёмах таблиц не будут ли тормоза?) С другой стороны, раз такая задача со столькими офисами, то значит, и скорость должна дожиматься крутой ТЕХНИКОЙ-ЖЕЛЕЗОМ ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2002, 12:07:25 |
|
||
|
Как лучше организовать структуру таблицы?
|
|||
|---|---|---|---|
|
#18+
Если сравнивать использование в качестве PK совокупности Int_RecID + TinyInt_OfficeID с PK на одном GUID_ID, то, конечно же, размер PK будет меньше, и, следовательно, быстродействие выше. Но выиграв в быстродействии в 2 раза и проиграв в функциональности в те же два раза, вы проиграете в 2000 раз, потому что приложение окажется никому не нужным, если оно не сможет справиться хотя бы с 1% всех жизненных ситуаций. При этом к нему резко упадет доверие пользователей, некоторые из которые могут просто устроить саботаж даже в тех ситуациях, с которыми программа вполне может справиться. Это просто из жизненного опыта. Теперь по делу. Быстродействие по некоторым запросам, в которых несколько таблиц объединяются по JOIN, для первого и второго варианта PK врядли будет отличаться более чем в два раза. А общее быстродействие, субъективно воспринимаемое пользователем приложения, процентов на 20, не более. Но что вы будете делать, когда выяснится, что обмен информацией (хотя бы некоторой ее части) между офисами должен производиться в обе стороны при условии возможности ее модификации (а также удаления, обновления) одновременно во всех офисах? При выборе первого варианта вам останется либо застрелиться, либо уволиться. При выборе второго варианта просто порадуетесь, что для этого у вас все готово. GUID-PK лучше делать кластерным, проверено на практике. Не смотря на самые умные мысли, высказанные в литературе и на данном форуме. Если строго следовать теории, то получается, что GUID-поле, которое по своей сути не может интерпретироваться как поле, содержащее последовательно увеличивающиеся значения не очень подходит для кластерного индекса (а именно для полей с последовательно увеличивающимися значениями наиболее эффективно применять кластерный индекс). Использование некластерных индексов для такого поля должно быть более эффективным. Поддавшись теоретическим изыскам, я в своем проекте (в котором почти все таблицы имеют GUID PK) сделал PK всех таблиц некластерными (плюс, естественно, обновил статистики и полностью перекомпилировал скрипты). После чего получил жуткие тормоза (быстродействие упало раза в три. Вернул кластерные индексы обратно - все встало на свои места. Так что практика не всегда подтверждает теорию (либо практики не всегда правильно интерпретируют теорию, а теоретики - практику). Удачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2002, 17:20:52 |
|
||
|
Как лучше организовать структуру таблицы?
|
|||
|---|---|---|---|
|
#18+
Большое спасибо, Garya! Лаконично, понятно и вразумительно. Можно ещё вопрос в некоем продолжении темы?! Обращаясь к разным спецам по поводу: надо ли для Identity PK- Clustered Index Или всё же NonClastered, а точнее вопрос вот в чём: если IDENTITY PK имеет кластерный индекс, то при интенсивной вставке записей в таблицу вроде как идёт конкуренция за последнюю страницу (кажись, ситуёвина эта hot spot называется), но вроде как это с 7-ой версии устранено, а с другой стороны кластерный индекс даёт выигрыш при SELECT-ах. Каково резюме? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2002, 06:10:46 |
|
||
|
Как лучше организовать структуру таблицы?
|
|||
|---|---|---|---|
|
#18+
2 Garya Основной проблемой слияния 2 баз является отслеживание измененных и удаленных записей (с новыми все просто). Из Ваших постингов я так и не понял, какое преимущество в этом плане дает GUID_ID перед Int_RecID + TinyInt_OfficeID в качестве PK ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2002, 15:17:21 |
|
||
|
Как лучше организовать структуру таблицы?
|
|||
|---|---|---|---|
|
#18+
2 ВладимирМ. Извините, в последнее время на работе поджимает, поэтому на форуме редко появляюсь... А по сути вопроса примерно так. Если модификация записей возможна в нескольких офисах, то требуется двусторонняя репликация. Репликация транзакиций не рассматривается, поскольку для удаленных офисов и медленных каналов она не годится. Snapshot-репликация может производиться только очень редко, если объемы данных велики, и она также не годится для двунаправленного обмена при модификациях записей на обеих сторонах. Остается Merge-репликация, для организации которой вам в любом случае потребуется ROWGUID-поле типа Uniqueidentifier. Если вы его изначально не заведете в таблице, оно появится само. Я ответил? Или еще требуется перебор вариантов обмена через DTS? Главное понимать, что любой вид репликации использует какую-то дополнительную информацию. При репликации транзакций, в частности (которая для нашего случая не подходит), используется поле TimeStamp, которое также возникнет в таблице помимо вашего желания... От подобной информационной избыточности вы никуда не денетесь. Важно эту информационную избыточность совместить со стандартными механизмами, использующимися для классических решений подобных задач (IMHO), а не изобретать велосипед. Потому что изобретенный велосипед скорее всего окажется хуже проверенного жизнью и специалистами MS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2002, 15:33:06 |
|
||
|
Как лучше организовать структуру таблицы?
|
|||
|---|---|---|---|
|
#18+
2 Garay Т.е. речь идет о стандартном механизме репликации MS SQL, который при любом раскладе все-равно создаст GUID_ID поэтому есть смысл его и использовать чтобы не плодить лишних полей. А если рассматривать некую абстрактную модель в отрыве от конкректного механизма репликации, то разницы не существует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2002, 08:00:27 |
|
||
|
Как лучше организовать структуру таблицы?
|
|||
|---|---|---|---|
|
#18+
Согласен. Только на создание собственных механизмов репликации можно и жизнь потратить... А потом, уже на пенсии, оглянешься и задумаешься: "И на фига же я столько сил на изобретение колеса потратил?".... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2002, 17:02:58 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32030120&tid=1822553]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
213ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
76ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 581ms |

| 0 / 0 |
