|
|
|
Картотека
|
|||
|---|---|---|---|
|
#18+
Здравствуйте уважаемые, Задача создать картотеку на SQL, в которой у карт произвольные атрибуты, которые можно в процессе эксплуатации расширять. Например, ФИО, Пол, Возраст, ... А затем производить выборки по значениям атрибутов. Картотека может содержать более 1 000 000 записей. Сначала хотел сделать на трех таблицах (упрощенно) 1 Карты, 2 Атрибуты, 3 Кростаблица - атрибуты карт и в нее же класть значение параметра в тексте. Вырисовываются проблемы 1)с Select сравнивать нужно параметры сгруппированные по карте. 2) Могут понадобиться операции над числовыми данными или датами, < > !=. затем другой вариант 1 Карты, 2 Атрибуты. В таблице Карты создать поле Content и в него запихать содержимое всей карты через разделители и по этому полю осуществлять полнотекстный поиск. Проблема 2) Могут понадобиться операции над числовыми данными или датами, < > !=. Остается Xml пользоваться нельзя по свыше данным установкам. Если кто-нибудь встречался с такой занозой - направте в нужное русло плиз. Модератор: Тема перенесена из форума "Microsoft SQL Server". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2009, 20:11 |
|
||
|
Картотека
|
|||
|---|---|---|---|
|
#18+
Возможна ли ситуация, когда у разных карточек разные атрибуты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2009, 20:59 |
|
||
|
Картотека
|
|||
|---|---|---|---|
|
#18+
Senya_L, не понял, чем тебе первый вариант не нравится? По подробнее, pls ЗЫ я бы его выбрал (только может быть чем-нибудь дополнил - от специфики) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2009, 08:20 |
|
||
|
Картотека
|
|||
|---|---|---|---|
|
#18+
Есть ещё третий вариант - у каточки сделать атрибуты просто в виде полей. Если атрибуты совсем произвольные, то первый вариант, если количество ограниченное, расширяться будет постепенно, по мере развития системы, атрибуты используются в коде, в логике - то третий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2009, 10:01 |
|
||
|
Картотека
|
|||
|---|---|---|---|
|
#18+
KrebА затем производить выборки по значениям атрибутов. Картотека может содержать более 1 000 000 записей. Для начала неплохо определится, что из себя будут представлять выборки, как много полей в условиях запросов будет задействовано и будут ли сложные условия. Сами понимаете - на все случае жизни обычные OLTP сервера индексов не напасутся ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2009, 10:12 |
|
||
|
Картотека
|
|||
|---|---|---|---|
|
#18+
KOT MATPOCKuHSenya_L, не понял, чем тебе первый вариант не нравится? По подробнее, pls ЗЫ я бы его выбрал (только может быть чем-нибудь дополнил - от специфики)Разве я говорил, что не нравится? Просто уточнить хотел по атрибутам: 1) их переменное количество или постоянное, 2) типы атрибутов фиксированный или переменный, 3) допустим ли для всех атрибутов тип строковой? Я могу догадаться, какими будут ответы, но лучше переспросить. И не то чтобы не нравиться, но смущает то, что авторКартотека может содержать более 1 000 000 записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2009, 11:22 |
|
||
|
Картотека
|
|||
|---|---|---|---|
|
#18+
Уточняю решение по варианту №1: 1) Сущность <Атрибуты> - собственно справочник, содержит поля: Атрибут_ID - Суррогатный ключ Атрибут_NAME - Название аттрибута Атрибут_DEFAULT - Значение аттрибута по-умолчанию Уникальный индекс (ключ) по Атрибут_ID Уникальный индекс по Атрибут_NAME особенности: при добавлении аттрибута в справочник - значение данного аттрибута автоматически добавляется всем аттрубутам карточек со значением по-умолчанию (Предлагаю физически в базу - так проще потом запросы делать). При удалении - удалять записи из аттрибутов карточек. 2) Сущность <Карточки> - содержит экземпляры карточек, поля: Карточка_ID - Суррогатный ключ ... - технические поля, например дата создания карточки Уникальный индекс (ключ) по Карточка_ID 3) Сущность <Аттрибуты_карточек> - Список аттрибутов карточек. Поля: Аттрибут_карточки_ID - Суррогатный ключ Карточка_ID - Карточка Атрибут_ID - Аттрибут Значение - Строковое значение аттрибута Уникальный индекс (ключ) по Аттрибут_карточки_ID Уникальный индекс (ключ) по (Карточка_ID, Атрибут_ID) Индекс по Карточка_ID Индекс по Атрибут_ID еще можно по (Атрибут_ID, Значение) и/или (Атрибут_ID, To_Date(Значение)) - для оракла, в MS сами напишите и т.д. Больше всего объем будут занимать именно эти индексы. Они же примут на себя основную нагрузку в обеспечении производительности. ---------- Запрос с критериями: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Теоретически, можно три значения аттрибута хранить - как строку, число и дату, а использовать то, что нада, остальное - NULL. Потеряем в объеме, в производительности должны выиграть (наверно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2009, 13:41 |
|
||
|
Картотека
|
|||
|---|---|---|---|
|
#18+
Senya_LИ не то чтобы не нравиться, но смущает то, что авторКартотека может содержать более 1 000 000 записей. Это не много. Вот для аттрибутов карточек, если видов аттрибутов 50, то получаем уже 50 000 000 записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2009, 13:43 |
|
||
|
Картотека
|
|||
|---|---|---|---|
|
#18+
Еще один вариант: две сущности, первая - карточка с аттрибутами, вторая - метаданные аттрибутов. Нужно добавить аттрибут - расширьте таблицу (первую) и добавьте данные во вторую. Первая - снужными типами данных и т.д. Вторая таблица нужна только для сопоставления человеческих названий с названиями полей в БД (первой таблице), описания их типов - для построения нормального клиента. А что? СУБД зачем нужна?! Правильно, чтобы управлять. Вот и пусть управляет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2009, 13:55 |
|
||
|
Картотека
|
|||
|---|---|---|---|
|
#18+
KOT MATPOCKuHЕще один вариант: две сущности, первая - карточка с аттрибутами, вторая - метаданные аттрибутов.А как это будет выглядеть с CREATE TABLE? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2009, 14:32 |
|
||
|
Картотека
|
|||
|---|---|---|---|
|
#18+
Огромное спасибо за обсуждение, Привожу картинку как это мне видится на данный момент (упрощенно). Есть сущности Карты Атрибуты Типы. Типы могут быть вложенными это свойство поддерживается таблицей Typedependens. С CardAttribute все понятно. Однако значение атрибута может иметь простой или составной тип. Объекты значений атрибутов сведены в ObjectValue. Маленькая табличка AttribeteRegex это зародыш регулярных выражений для проверки правильности ввода значений объектов атрибутов. Вариант с добавлением полей не подходит на мой взгляд т.к. придется менять запросы по выборке данных и клиентскую часть. Для разных карт разные полностью атрибуты не будут это не нужно. Справочник один. А вот состав атрибутов может отличаться в соответствии с имеющимися данными. При добавлении нового атрибута добавлять его во все карты нет необходимости, т.к. параметры при этом не вводятся а хранить в БД пустые строки мне кажется не стоит. Если 1000 000 карточек, ввели новый параметр, то автоматом в CardAttribute появится 1 000 000 записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2009, 14:41 |
|
||
|
Картотека
|
|||
|---|---|---|---|
|
#18+
чего то картинка не зааттачилась ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2009, 14:42 |
|
||
|
Картотека
|
|||
|---|---|---|---|
|
#18+
KrebДля разных карт разные полностью атрибуты не будут это не нужно. Справочник один.И ради чего тогда, простите, трахаете моск?! Одна таблица для карточек, возможно кое-какие справочные таблицы. Чего мудрить-то? Вы это все затеяли, чтобы при "Если 1000 000 карточек, ввели новый параметр, то автоматом в CardAttribute появится 1 000 000 записей."? Вообще-то есть дефолтные поля у таблиц на этот случай, есть также нуллябливые поля. KOT MATPOCKuH, Я же не зря спрашивал афтора про переменный состав атрибутов ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2009, 14:49 |
|
||
|
Картотека
|
|||
|---|---|---|---|
|
#18+
KOT MATPOCKuH, Поясните, пожалуйста как быть, если значения параметров например int или Datetime. В таблице значений они текстовые, а искать используя Cast( as ) - не Гуд. СУБД PosgreSQL 8.3. Идею использовать индексы адаптированные к типу скрытому в varchar не уловил. и/или (Атрибут_ID, To_Date(Значение)) - для оракла, в MS сами напишите и т.д. С уважением ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2009, 15:23 |
|
||
|
Картотека
|
|||
|---|---|---|---|
|
#18+
Kreb, Вы можете объяснить, зачем Вам понадобилась модель EAV, если у ВСЕХ карточек в картотеке количество атрибутов одинаковое и состав (как я понял) один и тот же? Добавить столбец в процессе эксплуатации очень легко: alter table ... add column. Может я чего-то недопонимаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2009, 19:29 |
|
||
|
Картотека
|
|||
|---|---|---|---|
|
#18+
Senya_LKOT MATPOCKuHЕще один вариант: две сущности, первая - карточка с аттрибутами, вторая - метаданные аттрибутов.А как это будет выглядеть с CREATE TABLE? Не CREATE TABLE, а ALTER TABLE ADD COLUMN ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2009, 12:16 |
|
||
|
Картотека
|
|||
|---|---|---|---|
|
#18+
Senya_LKrebДля разных карт разные полностью атрибуты не будут это не нужно. Справочник один.И ради чего тогда, простите, трахаете моск?! Одна таблица для карточек, возможно кое-какие справочные таблицы. Чего мудрить-то? Вы это все затеяли, чтобы при "Если 1000 000 карточек, ввели новый параметр, то автоматом в CardAttribute появится 1 000 000 записей."? Вообще-то есть дефолтные поля у таблиц на этот случай, есть также нуллябливые поля. KOT MATPOCKuH, Я же не зря спрашивал афтора про переменный состав атрибутов ;)Дак я-то понял, просто ответа от автора не было какое-то время, вот и предлогал... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2009, 12:18 |
|
||
|
Картотека
|
|||
|---|---|---|---|
|
#18+
KOT MATPOCKuHSenya_LKOT MATPOCKuHЕще один вариант: две сущности, первая - карточка с аттрибутами, вторая - метаданные аттрибутов.А как это будет выглядеть с CREATE TABLE? Не CREATE TABLE, а ALTER TABLE ADD COLUMNЯ имел ввиду DDL модели EAV. А то, что здесь нужна одна таблица - автор молчит, хоть ты развей мои сомнения. Автор-то забил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2009, 12:20 |
|
||
|
Картотека
|
|||
|---|---|---|---|
|
#18+
KrebKOT MATPOCKuH, Поясните, пожалуйста как быть, если значения параметров например int или Datetime. В таблице значений они текстовые, а искать используя Cast( as ) - не Гуд. СУБД PosgreSQL 8.3. Идею использовать индексы адаптированные к типу скрытому в varchar не уловил. и/или (Атрибут_ID, To_Date(Значение)) - для оракла, в MS сами напишите и т.д. С уважениемКак вариант предлогалось следующее: в таблице значений аттрибутов карточек хранить не одно поле значений типа текст, а три поля: текст, дата, число. Что именно используется для конкретного параметра - описать в справочнике аттрибутов. А в запросах - вы же сами знаете, что возраст - это число, а дата рождения - это дата. Соответствующие поля и используете, когда пишите SELECT. В "универсальных" запросах - через справочник получаете тип, по нему - используете соответствующее поле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2009, 12:22 |
|
||
|
Картотека
|
|||
|---|---|---|---|
|
#18+
Kreb... СУБД PosgreSQL 8.3.... А чего: Модератор: Тема перенесена из форума "Microsoft SQL Server". ????? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2009, 12:24 |
|
||
|
Картотека
|
|||
|---|---|---|---|
|
#18+
Senya_LKOT MATPOCKuHSenya_LKOT MATPOCKuHЕще один вариант: две сущности, первая - карточка с аттрибутами, вторая - метаданные аттрибутов.А как это будет выглядеть с CREATE TABLE? Не CREATE TABLE, а ALTER TABLE ADD COLUMNЯ имел ввиду DDL модели EAV. А то, что здесь нужна одна таблица - автор молчит, хоть ты развей мои сомнения. Автор-то забил.Не понял, какие сомнения развеить? Что нужно автору - ему и выбирать, мы только предлагаем варианты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2009, 12:26 |
|
||
|
Картотека
|
|||
|---|---|---|---|
|
#18+
А что, посчитать некошерно? Из-за такой ерундовины так ломать нормальную структуру с одной таблицей? Сползаю под стул... :) > Автор: KOT MATPOCKuH > Kreb > KOT MATPOCKuH, > Поясните, пожалуйста как быть, если значения параметров > например int или Datetime. В таблице значений они текстовые, > а искать используя Cast( as ) - не Гуд. > СУБД PosgreSQL 8.3. Идею использовать индексы адаптированные к > типу скрытому в varchar не уловил. > > и/или (Атрибут_ID, To_Date(Значение)) - для оракла, в MS сами > напишите и т.д. > > С уважением > Как вариант предлогалось следующее: в таблице значений аттрибутов > карточек хранить не одно поле значений типа текст, а три поля: текст, > дата, число. Что именно используется для конкретного параметра - описать в > справочнике аттрибутов. А в запросах - вы же сами знаете, что возраст - > это число, а дата рождения - это дата. Соответствующие поля и используете, > когда пишите SELECT. В "универсальных" запросах - через справочник > получаете тип, по нему - используете соответствующее поле. > Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2009, 12:27 |
|
||
|
Картотека
|
|||
|---|---|---|---|
|
#18+
> Автор: KOT MATPOCKuH > Не понял, какие сомнения развеить? Что нужно автору - ему и выбирать, > мы только предлагаем варианты > Я сомневался, правильно я понял постановку задачи автора. В смысле нужен ли ему вообще EAV или нет. Я думаю, что нет. И в своем первом топике не напрасно уточнил про состав атрибутов у карточек. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2009, 12:29 |
|
||
|
Картотека
|
|||
|---|---|---|---|
|
#18+
Senya_L А что, посчитать некошерно? Из-за такой ерундовины так ломать нормальную структуру с одной таблицей? Сползаю под стул... :) Держись!!!! Да, некошерно из-за объемов данных и универсальности вопроса. Если бы карточек было 100-200 - было бы без разницы, но когда начинаем считать милионы... Я в одном из своих предложений показывал, что по полю "значение" таблицы значений аттрибутов карточек нужен индекс. Иначе, для любого запроса с ограничением значений аттрибутов будем иметь FULL TABLE SCAN, т.е. полный просмотр большой таблицы. В оракле, например, можно сделать одно текстовое поле, но сделать индексы: - по самому, полю - по функциям преобразования значения поля к числу, дате и др.. Тогда SELECT * From T Where to_number(val) = 10, при наличии индекса на to_number(val) будет выполняться по индексу очень быстро. (Кстати, как следствие такого решения для упращения запросов я предлгал прописывать значениями по-умолчанию значение нового аттрибута во всех карточках) В других СУБД чаще всего такое невозможно, а т.к. автор задал вопрос на этот форум, то нужно универсальное решение, не зависящее от СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2009, 12:48 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=35808116&tid=1543446]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
54ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
44ms |
get tp. blocked users: |
2ms |
| others: | 220ms |
| total: | 360ms |

| 0 / 0 |
