powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как добавить интернационализацию в EAV базу данных?
11 сообщений из 36, страница 2 из 2
Как добавить интернационализацию в EAV базу данных?
    #37714780
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Я вот подумал. У меня ресурс - уникальное значение. Один ресурс не может быть к
> разным Entity или Parameter. Поэтому зависимость получается M:1.

Так ты ресурс-то не бери, ресурс -- это у тебя уже для конкретного языка.
В общем, не важно.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как добавить интернационализацию в EAV базу данных?
    #37714781
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Ок, у меня фамилия - 1 штука, имя - 1 штука, отчество - 1 штука. Почему я не
> могу сделать 3 столбца (lastname, firstname, middlename) в таблице клиентов?

Можешь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как добавить интернационализацию в EAV базу данных?
    #37714782
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Это очень надуманная причина. Многое решается генерацией кода.
> ЗЫ. Я согласен с тем, что количество языков будет фиксировано на этапе
> проектирования.

Генерацией кода вообще всё решается.
Но это не довод в пользу чего-то.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как добавить интернационализацию в EAV базу данных?
    #37714785
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Ок

Вам сказали, что это ошибка. Просто запомните это и никогда так не делайте.

> у меня фамилия - 1 штука

Ничего общего с обсуждаемой задачей.

Но и так

> 3 столбца (lastname, firstname, middlename)

делать не следует. Домашнее задание: обоснуйте самостоятельно, почему именно.

ТС, ваш вариант решения задачи плох. Вы пишите:

> "Компьютер" - EntityType
> "Онитрон 5" - Entity (конкретная модель компьютера)
> "Процессор", "Тип охлаждения" - Attribute
> "Core2Duo 2.6Ггц", "жидкий" - Parameter

"Core2Duo 2.6 ГГц" не имеет локализованного эквивалента. Более того, это составной атрибут (вообще говоря, элемент с атрибутом, но в данном случае это не важно). Для корректной реализации вам нужно решить три задачи: метаописание экземпляров сущностей, _реляционная_ подстановка элементов и атрибутов, локализация (при существовании локализованных эквивалентов). MasterZiv предложил вам рабочую схему, но на практике вам будет сложно ее развивать.
...
Рейтинг: 0 / 0
Как добавить интернационализацию в EAV базу данных?
    #37716184
Vetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv> Я вот подумал. У меня ресурс - уникальное значение. Один ресурс не может быть к
> разным Entity или Parameter. Поэтому зависимость получается M:1.

Так ты ресурс-то не бери, ресурс -- это у тебя уже для конкретного языка.
В общем, не важно.

Не понял, о чем Вы, можете расшифровать? :)


guest_20040621ТС, ваш вариант решения задачи плох.
Для корректной реализации вам нужно решить три задачи: метаописание экземпляров сущностей, _реляционная_ подстановка элементов и атрибутов, локализация (при существовании локализованных эквивалентов). MasterZiv предложил вам рабочую схему, но на практике вам будет сложно ее развивать.
Так я ж вроде как и иду по решению от MasterZiv. И где у меня плохо с описанными Вами тремя задачами?


MasterZiv
> varcharValue varchar(4096),
>
> Чем Ваше решение лучше?

Тогда либо для них надо вставлять в PK что -то типа специального идентификатора
языка, либо надо тоже выносить varcharValue в подтаблицу с языком в PK.

Ой, извините, забыл прибить это поле, конечно же, этого поля не будет, будет запись для каждого языка в таблице Resource.

MasterZivКроме этого, наверняка тебе захочется создать индексы на разные xxValue,
чтобы по ним можно было бы искать. Это уже тонкая материя, тут уже надо знать
о конкретике СУБД в реализации, но всё же, для каждого xxxVal в таблице
будет N записей (всего атрибутов), из них n будет этого значения,
а N-n будет NULL. Это может портить статистику и селективность. А может и не
портить.
Кстати да, действительно, я об этом раньше не задумывался... По идее, не должно портить, просто в статистике будет храниться информация о том, сколько там NULL значений. Как оно в реальной жизни будет, это конечно еще вопрос...
Если по таблице на каждый тип атрибута (date, int, varchar, text, float, boolean, char_id), так это вместо одного селекта будет семь, если брать данный случай. Вас не смущает такое количество лишних селектов? Это тоже может плохо сказаться на производительности. Та и закодить это сложнее будет



Вобщем, подумали мы, как сделать с тем, чтобы интернационализировать все таблицы, и придумали следующее решение:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
create table Resource(
    id varchar(32),	
    varcharValue varchar(4096),
    textValue text,
    PRIMARY KEY (id)
);

create table Language(
    id varchar(32),
    name varchar(32),
    PRIMARY KEY (id)
);

create table main.LanguageResource(
    id varchar(32),
    resourceId varchar(32) REFERENCES Resource(id),
    languageId varchar(32) REFERENCES Language(id), 
    varcharValue varchar(4096),
    textValue text,
    PRIMARY KEY (id)
);

create table main.Attribute(
    id varchar(32),
    entityTypeId varchar(32) REFERENCES EntityType(id),
    nameId varchar(32) REFERENCES Resource(id),
	-- other fields
    PRIMARY KEY (id)
);

create table main.Parameter(
    entityId varchar(32) REFERENCES Entity(id),
    attributeId varchar(32) REFERENCES Attribute(id),
    stringValueId varchar(32) REFERENCES Resource(id),
    integerValue integer,
    floatValue float,
    datetimeValue timestamp,
    booleanValue boolean,
    entityValue varchar(32) REFERENCES Entity(id),
    PRIMARY KEY (entityId, attributeId)
);



Именно создание промежуточной таблицы Resource позволит нам не заводить по языковой таблице на каждую таблицу БД, или создавать по одному атрибуту на каждую таблицу в большой языковой таблице.

Также у нас будут разделы сайта, которые не нужно интернационализировать. Для этого случая мы вынесли varcharValue и textValue в таблицу Resource.

Что скажете насчет такого решения?
...
Рейтинг: 0 / 0
Как добавить интернационализацию в EAV базу данных?
    #37716281
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> И где у меня плохо с описанными Вами тремя задачами?

Ни одна из задач не решена.
...
Рейтинг: 0 / 0
Как добавить интернационализацию в EAV базу данных?
    #37716412
Vetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_20040621> И где у меня плохо с описанными Вами тремя задачами?
Ни одна из задач не решена.
Почему? Я наоборот считал, что решена. Можете разъяснить, пожалуйста, я не понимаю
...
Рейтинг: 0 / 0
Как добавить интернационализацию в EAV базу данных?
    #37716837
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Я наоборот считал, что решена.

Вы занимаетесь реализацией, спрос будет с вас, поэтому определять состояние задачи тоже вам.

> Можете разъяснить

Возьмите больше реальных примеров, смоделируйте работу оператора, недостатки станут очевидны. Вы обязательно столкнетесь с необязательностью существования языковых эквивалентов и их множественностью. Плюс обычный геморрой EAV.

Если ваша задача - сдать проект заказчику и забыть о нем, нарисовать красивые тестовые данные для демонстрации - не проблема. Но если вы заинтересованы в качественной реализации, описать системы мер - уже нетривиальная задача, не говоря о структуре продуктов.
...
Рейтинг: 0 / 0
Как добавить интернационализацию в EAV базу данных?
    #37716854
Vetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_20040621> Я наоборот считал, что решена.

Вы занимаетесь реализацией, спрос будет с вас, поэтому определять состояние задачи тоже вам.

Вот я и хочу разобраться, чтобы спроса плохого не было :) На своем уровне опыта я явных косяков не вижу. Поэтому раз Вы видите, я и прошу помочь

guest_20040621> Можете разъяснить

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

guest_20040621Если ваша задача - сдать проект заказчику и забыть о нем, нарисовать красивые тестовые данные для демонстрации - не проблема. Но если вы заинтересованы в качественной реализации, описать системы мер - уже нетривиальная задача, не говоря о структуре продуктов.
Мы заинтересованы в качественной реализации. Не видим проблем в системе мер. В таблице Attribute у нас есть атрибут measurementId, который также ссылается на таблицу ресурсов, а оттуда уже под конкретный язык выбирается текст описания единицы измерения.
Со структурой продуктов тоже не вижу проблемы. parentId в Entity все решает.
Я Вас правильно понял? Если нет, то если можно, больше конкретики.
...
Рейтинг: 0 / 0
Как добавить интернационализацию в EAV базу данных?
    #37716907
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> сущность не поддерживает интернационализацию

Это простой случай. Если вы начнете различать английский и американский английский, работы прибавится. А если вы пойдете дальше, то выяснится, что один и тот же продукт на разных рынках имеет разное (иногда, например, в случае ЛС - защищенное) наименование.

Сложно давать рекомендации "в общем", без ограничения области применения.

> Не видим проблем в системе мер

Т. е. вы себе хорошо представляете, что в каком государстве измеряется в пинтах, дюймах, фунтах, унциях, тройских унциях, баррелях и пр.? Вы готовы описать практику использования префиксов для двоичной системы счисления, используемых конкретными вендорами? ;)

> parentId в Entity все решает

Ваша структура позволяет получить формальное описание каждого продукта с учетом количества возможных вхождений компонентов и их обязательности? Четыре процессора в компьютере - это ошибка оператора или это сервер?
...
Рейтинг: 0 / 0
Как добавить интернационализацию в EAV базу данных?
    #37716960
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Не понял, о чем Вы, можете расшифровать? :)

Ты рассматривал cardinality относительно уже таблицы связи, которая
реализует ту связь, которую обсуждали мы. Естественно, если изначально
связь M:N, если спуститься ниже на таблицу, это будет 1:N
> Кстати да, действительно, я об этом раньше не задумывался... По идее, не должно
> портить, просто в статистике будет храниться информация о том, сколько там NULL

Зависит от СУБД, по-разному трактуются NULL-ы в индексах. PG я к сожалению не знаю.

> значений. Как оно в реальной жизни будет, это конечно еще вопрос...
> Если по таблице на каждый тип атрибута (date, int, varchar, text, float,
> boolean, char_id), так это вместо одного селекта будет семь,
если брать данный
> случай. Вас не смущает такое количество лишних селектов? Это тоже может плохо
> сказаться на производительности. Та и закодить это сложнее будет

Не, ерунда. Там, где в запросе есть PK в виде SARG-а, можно хоть 200 jOIN-ов
навертеть, или 200 UNION-ов.

>
> Вобщем, подумали мы, как сделать с тем, чтобы интернационализировать все
> таблицы, и придумали следующее решение:

Я потом гляну может некогда сейчас.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11 сообщений из 36, страница 2 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как добавить интернационализацию в EAV базу данных?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]