|
|
|
Не совсем реалиционная система... как организовать?
|
|||
|---|---|---|---|
|
#18+
Хочется организовать структуру данных с нефиксированым набором атрибутов. Есть какой-то объект в таблице, хотелось бы с ним связать любое количество параметров(атрибутов) и чтобы значения данного атрибута были типизированы - т.е. сохранялись возможности для поиска, вывода в отсортированом виде и т.д. Своего рода 3D-модель (обьект-атрибут-значение атрибута) Проще говоря я хочу иметь возможность модифицировать не только значения отдельных полей, но и добавлять/удалять поля - это должна быть штатная операция. Этого можно сделать к примеру если использовать ALTER TABLE ... ADD/DELETE COLUMN ... Но это не совсем удачное решение. Есть ли для этого какие-то готовые решения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2007, 23:49 |
|
||
|
Не совсем реалиционная система... как организовать?
|
|||
|---|---|---|---|
|
#18+
sycoreХочется организовать структуру данных с нефиксированым набором атрибутов. Есть какой-то объект в таблице, хотелось бы с ним связать любое количество параметров(атрибутов) и чтобы значения данного атрибута были типизированы - т.е. сохранялись возможности для поиска, вывода в отсортированом виде и т.д. Своего рода 3D-модель (обьект-атрибут-значение атрибута) Проще говоря я хочу иметь возможность модифицировать не только значения отдельных полей, но и добавлять/удалять поля - это должна быть штатная операция. Этого можно сделать к примеру если использовать ALTER TABLE ... ADD/DELETE COLUMN ... Но это не совсем удачное решение. Есть ли для этого какие-то готовые решения? Ну и храните в "Своего рода 3D-модель (обьект-атрибут-значение атрибута)" виде. Выбрать можно всегда, а после уж сортируйте как хотите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2007, 00:47 |
|
||
|
Не совсем реалиционная система... как организовать?
|
|||
|---|---|---|---|
|
#18+
[quot sycore]Хочется организовать структуру данных с нефиксированым набором атрибутов. Есть какой-то объект в таблице, хотелось бы с ним связать любое количество параметров(атрибутов) и чтобы значения данного атрибута были типизированы - т.е. сохранялись возможности для поиска, вывода в отсортированом виде и т.д. Своего рода 3D-модель (обьект-атрибут-значение атрибута)[quot] Для таких задач подходят СУБД Pick, UniVerse, JBase. В них каждая запись состоит из атрибутов. Атрибут в свою очередь может содержать значение, значение - подзначение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2007, 00:50 |
|
||
|
Не совсем реалиционная система... как организовать?
|
|||
|---|---|---|---|
|
#18+
Или совсем развернуть вдоль (дополнительная таблица Values (id, TableID, RecordID, FieldName, FieldValue)), или наделать в основной таблице кучу полей Int1, Int2, String1, String2 (смысл им придавать у каждой записи свой, хранить соответствие в каком-нибудь справочнике). В 1м варианте - медленно и запросы сложные, во 2м - путаница какое поле что означает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2007, 00:57 |
|
||
|
Не совсем реалиционная система... как организовать?
|
|||
|---|---|---|---|
|
#18+
> Ну и храните в "Своего рода 3D-модель (обьект-атрибут-значение атрибута)" виде. Выбрать можно всегда, а после уж сортируйте как хотите. неее, своими силами сортировку проводить не хочется совсем.... будет 100000 значений - все придётся выбирать чтобы вывести с 25 по 50 > Для таких задач подходят СУБД Pick, UniVerse, JBase. Честно говоря я не сомневаюсь, что решений масса есть, но всё-таки хочется ориентироваться на обычные реляционные БД. Как-то же это должно решаться. > или совсем развернуть вдоль (дополнительная таблица Values (id, TableID, RecordID, FieldName, FieldValue)), Вот это уже ближе.Я вот собственно к такой схеме и склоняюсь. Только скорее так: Records (Id, AttributeSetId) AttributeSets (Id) Fields (Id, AttrubuteSetId, FieldName, FieldType (int)) -- Таблица атрибутов ValueType1 (FieldId, RecordId, FieldValue(int)) -- Таблица целочисленых значений ValueType2 (FieldId, RecordId, FieldValue(text)) -- Таблица тестовых значений .... И так для всех типов, будет немного. В данном случае каждая запись в Record имеет набор атрибутов - это одно измерение. Чтобы выцепить список - мы сперва выбираем список атрибутов. Дальше мы выцепляем по этому набору ОДНИМ запросом с использованием OUTER JOIN прям табичку, в которой будут все значения всех атрибутов и тут же можно осуществлять сортировку, фильтрацию. Проверено - работает. На мой взгляд если число атрибутов относительно невелико (ну до 10 например) - так жить можно. Но это первое что пришло в голову. Но может всё-же есть какие-то уже более качественные решения,не хочется изобретать велосипед. > или наделать в основной таблице кучу полей Int1, Int2, String1, String2 (смысл им придавать у каждой записи свой, хранить соответствие в каком-нибудь справочнике). Ну тоже вариант, только куча всё равно получится ограниченой. Возможно комбинирование вариантов 1 и 2 - те наделать в Records 3-4 поля каждого типа (ну или в соответствии с частотой использования) и использовать "статические" и "динамические" поля совместно. Причём статические также включать в описание. Тогда динамические поля будут использованы нечасто, в результате производительность не будет страдать сильно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2007, 01:18 |
|
||
|
Не совсем реалиционная система... как организовать?
|
|||
|---|---|---|---|
|
#18+
? DECISION CUBE от Borland (Delphi 7 в других аналогов не знаю) Но замудрили вы конкретно :) может как то можно обойтись без этого (через ООП например) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2007, 08:56 |
|
||
|
Не совсем реалиционная система... как организовать?
|
|||
|---|---|---|---|
|
#18+
sycore На мой взгляд если число атрибутов относительно невелико (ну до 10 например) - так жить можно. Если невелико, то действительно можно. Но я наблюдал систему построенную по такому принципу и поначалу там число таких атрибутов действительно было невелико, но относительная простота добавления нового атрибута сильно развращает программистов. Сейчас в этой системе таких атрибутов более тысячи и работать с этим стало нельзя. Даже изначально в такой структуре можно было хранить только "непоисковые" атрибуты, так как уже при скромной паре миллионов записей в списке обектов, количество записей в таблице атрибутов измерялось десятками миллионов, а теперь... Вывод - такую структуру можно использовать, если эти атрибуты заполняются в малом (не более 5, по моим оценкам) проценте случаев. В противном же случае надо для каждого атрибута добавлять колонки в таблицы. Не обязательно все их пихать в одну таблицу - можно сделать несколько таблиц, объединив атрибуты в логически связанные группы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2007, 09:21 |
|
||
|
Не совсем реалиционная система... как организовать?
|
|||
|---|---|---|---|
|
#18+
поиск рулит . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2007, 09:37 |
|
||
|
Не совсем реалиционная система... как организовать?
|
|||
|---|---|---|---|
|
#18+
sycore> Для таких задач подходят СУБД Pick, UniVerse, JBase. Честно говоря я не сомневаюсь, что решений масса есть, но всё-таки хочется ориентироваться на обычные реляционные БД. Как-то же это должно решаться. мягко говоря - странный подход. Или используйте СУБД, которые предназначены для хранения подобных структур или меняйте структуру, т.е. сделайте "обычные реляционные данные". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2007, 10:13 |
|
||
|
Не совсем реалиционная система... как организовать?
|
|||
|---|---|---|---|
|
#18+
iscrafm sycore> Для таких задач подходят СУБД Pick, UniVerse, JBase. Честно говоря я не сомневаюсь, что решений масса есть, но всё-таки хочется ориентироваться на обычные реляционные БД. Как-то же это должно решаться. мягко говоря - странный подход. Или используйте СУБД, которые предназначены для хранения подобных структур или меняйте структуру, т.е. сделайте "обычные реляционные данные". Валерий, а где можно динамически менят количество свойств объекта? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2007, 11:33 |
|
||
|
Не совсем реалиционная система... как организовать?
|
|||
|---|---|---|---|
|
#18+
Сахават Юсифов iscrafm sycore> Для таких задач подходят СУБД Pick, UniVerse, JBase. Честно говоря я не сомневаюсь, что решений масса есть, но всё-таки хочется ориентироваться на обычные реляционные БД. Как-то же это должно решаться. мягко говоря - странный подход. Или используйте СУБД, которые предназначены для хранения подобных структур или меняйте структуру, т.е. сделайте "обычные реляционные данные". Валерий, а где можно динамически менят количество свойств объекта? Пользователем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2007, 11:33 |
|
||
|
Не совсем реалиционная система... как организовать?
|
|||
|---|---|---|---|
|
#18+
1. таблица Объектов (ИД) 2. таблица Атрибутов (ИД,Наименование) 3. таблица ЗначенийАтрибутов (ИД,СсылкаНаОбъект,СсылкаНаАтрибут,Значение) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2007, 11:47 |
|
||
|
Не совсем реалиционная система... как организовать?
|
|||
|---|---|---|---|
|
#18+
Сахават Юсифов Валерий, а где можно динамически менят количество свойств объекта? Приветствую Сахават, допустим в объектных или XML-ориентированных базах... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2007, 12:22 |
|
||
|
Не совсем реалиционная система... как организовать?
|
|||
|---|---|---|---|
|
#18+
iscrafm Сахават Юсифов Валерий, а где можно динамически менят количество свойств объекта? Приветствую Сахават, допустим в объектных или XML-ориентированных базах... Ну, это не продашь. :) Легче самому на РМД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2007, 12:24 |
|
||
|
Не совсем реалиционная система... как организовать?
|
|||
|---|---|---|---|
|
#18+
sycoreЭтого можно сделать к примеру если использовать ALTER TABLE ... ADD/DELETE COLUMN ... Но это не совсем удачное решение. А что собственно не нравится? ИМХО, это лучшее по производительности и почти готовое решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2007, 13:37 |
|
||
|
Не совсем реалиционная система... как организовать?
|
|||
|---|---|---|---|
|
#18+
Так например абс ibso устроена:таблицы делаются через их Навигатор и там же добавляются атрибуты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2007, 13:52 |
|
||
|
Не совсем реалиционная система... как организовать?
|
|||
|---|---|---|---|
|
#18+
мой пост относится к mcureenab ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2007, 13:55 |
|
||
|
Не совсем реалиционная система... как организовать?
|
|||
|---|---|---|---|
|
#18+
>Если невелико, то действительно можно. Но я наблюдал систему построенную по такому принципу и поначалу там > число таких атрибутов действительно было невелико, но относительная простота добавления нового атрибута > сильно развращает программистов. Естественно реь идёт о "поисковых" атрибутах. Но пока мне симпатизирует комбинированое решение - когда часть атрибутов фиксируются в самой таблице, только переназначается их смысл. Причём если кол-во динамических атрибутов вырастет - мы можем увеличить кол-во статических посредством ALTER TABLE (сделать это руками) и перенести часть динамических атрибутов в статические. >поискрулит. да, если знаешь ключевые слова. Так что за EAV спасибо, собственно что я и хотел. > мягко говоря - странный подход. Или используйте СУБД, которые предназначены для хранения подобных структур или меняйте структуру, т.е. сделайте "обычные реляционные данные". Тут проблема вот в чём - таблица Records (условно) для которой необходимо найти решение по добавлению атрибутов - малая часть НОРМАЛЬНОЙ РЕЛЯЦИОННОЙ БД, в которой таких проблем нет и всё прекрасно укладывается в списочно-ссылочный формат. Стоит ли ради того чтобы красиво решить эту проблему привлекать специальные средства? Ещё момент - в этом случае БД требуется под ОС Linux и желатеьно свободная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2007, 14:35 |
|
||
|
Не совсем реалиционная система... как организовать?
|
|||
|---|---|---|---|
|
#18+
Вообще-то, проблема хрестоматийная. Уж сколько копий было сломано на этих "динамических" атрибутах... А сколько компьютеров вынуждали тормозить неграмотной архитектурой... В общем случае проблема, имхо, не имеет решения. Лучше либо грамотно спроектировать всю систему и ужать в свободе действий пользователей (что, кстати, часто практикуется), либо как-то иначе обрабатывать данные, не поддающиеся нормализации. Ещё один вариант "кривого" выхода - создавать под каждый атрибут свою таблицу. Но тогда вы должны иметь в виду, что общий размер базы будет равен примерно (n атрибутов * m записей), т.е. гигантским. И работать с JOINT-ами. С точки зрения производительности, это всё равно будет выгоднее чем создавать одну мегатаблицу с офигенным количеством "резервных" полей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2007, 04:11 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=34291573&tid=1544759]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
161ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 287ms |
| total: | 521ms |

| 0 / 0 |
