|
|
|
Подскажите как оптимально спроектировать
|
|||
|---|---|---|---|
|
#18+
Есть главная таблица tFIO (id, fio) с ней связана таблица местопроживания tAbode (id_fio, address, dates), где dates - дата начала проживания. В этой таблице будут храниться все адреса проживания какие были. Т.е. связь между таблицами один ко многим. Необходимо спроектировать так, чтобы можно было быстро узнать последнее местопроживания человека. База будет реализовано либо на Visual FoxPro либо на MS SQL. Если рассматривать приведенные структуры таблиц (допустим возьмем реализацию на VFP), то нахождение последнего места проживания довольно утомительно, т.к. надо сравнивать все записи для нахождения максимальной datas. Я вот думаю, может для ускорения поиска, ввести дополнительное логическое поле в tAbode, где б значение true указывало текущее местожительство, но тогда затрудняется добавление(редактирование) записей. Может быть что-нибудь подскажите? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 12:05 |
|
||
|
Подскажите как оптимально спроектировать
|
|||
|---|---|---|---|
|
#18+
Во-первых непонятно,что это такое в foxpro особенное,если в нем можно также сделать select max по дате, особенно если по полю построен индекс - такое ощущение,что Вы в курсоре искать макс собираетесь. второе-ну хочется вам ввести поле в адреса - введите и на триггере при простановке этого поля очищайте эти флаги в остальных записях третье - могу предложить пример мега-маразма: добавьте id на таблицу мест проживания (это стопудово понадобится в любом случае) и выбирайте запись с max id для этого человека, правда чем это отличается от макс даты - не ясно. четвертое - можно в человеке сделать ссылку на таблицу с адресами а-ля id текущего адреса проживания и прямо в форме его редактирования ее выставлять, собственно тогда задача поиска - выбор из таблицы адресов записи с id (вот он и понадобился :))=id_current_place (типа id тек места) в человеке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 12:37 |
|
||
|
Подскажите как оптимально спроектировать
|
|||
|---|---|---|---|
|
#18+
Shtockможно также сделать select max по дате дык правильно, но получается то не очень быстро: 1) найдем Maxdate: select max по дате 2) найдем Address соотв MaxDate: select adres where datas = maxdata Shtockхочется вам ввести поле в адреса - введите Shtockможно в человеке сделать ссылку на таблицу с адресами Если учитывать что таблица адресов намного больше таблицы человеков, то второй вариант выбрать предпочтительнее, но если учесть что будут еще связанные таблицы, навроде таблицы адресов, то получается надо добавлять для каждой таблицы соответствующее поле в таблицу человеков. Разве никто не сталкивался с ситуациями, когда требуется хранить некую историю, но в тоже время необходим механизм быстрого получения последних данных? Какой вариант выбрать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 13:28 |
|
||
|
Подскажите как оптимально спроектировать
|
|||
|---|---|---|---|
|
#18+
LeKo Shtockможно также сделать select max по дате дык правильно, но получается то не очень быстро: 1) найдем Maxdate: select max по дате 2) найдем Address соотв MaxDate: select adres where datas = maxdata А можно сделать так: Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 13:53 |
|
||
|
Подскажите как оптимально спроектировать
|
|||
|---|---|---|---|
|
#18+
собственно сглючил и не туда ответил, но p.s. был бы рад если модераторы бы перенесли ответ в эту тему ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 14:08 |
|
||
|
Подскажите как оптимально спроектировать
|
|||
|---|---|---|---|
|
#18+
Станислав, а предположим мне надо выбрать адреса 1000 определенных человек, то для каждого человека мне надо будет выполнять приведенный Вами select...а если эта таблица содержит миллионы записей!? Конечно можно сделать быстро. Допустим если рассматриваем FoxPro, то с помощью построения нужного составного индекса, а затем SEEK... Но я хотел бы узнать в общем как правильно организовывается структура таблиц в таких случаях, не вдаваясь в подробную реализацию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 14:17 |
|
||
|
Подскажите как оптимально спроектировать
|
|||
|---|---|---|---|
|
#18+
to Shtock Код: plaintext 1. 2. Вы только определяете последнюю дату, а ведь не адрес!? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 14:23 |
|
||
|
Подскажите как оптимально спроектировать
|
|||
|---|---|---|---|
|
#18+
блин,в foxpro нормальный sql.Зачем seek нужен то? select b.id_work from ( select max(b.dt) dt,id_people FROM test_work_people b group by id_people ) gr, test_work_people b where b.id_people=gr.id_people and gr.dt=b.dt ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 14:58 |
|
||
|
Подскажите как оптимально спроектировать
|
|||
|---|---|---|---|
|
#18+
select b.id_work from test_work_people b where b.dt=( select max(b2.dt) from test_work_people b2 where b2.id_people=b.id_people ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 15:01 |
|
||
|
|

start [/forum/search_topic.php?author=A_Zernov&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
176ms |
get topic data: |
8ms |
get first new msg: |
5ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 685ms |
| total: | 970ms |

| 0 / 0 |
