powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Помогите со структурой
18 сообщений из 18, страница 1 из 1
Помогите со структурой
    #37375759
srgio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица

transaction_table
source_id


source_id - источник поступления средств, может быть или наличные (cash) или депозит (deposit) или кредитная карта (credit_card)

cash _table

deposit _table

credit_card_table


Как правильно связать transaction_table и таблицы cash _table , deposit _table, credit_card_table ?
...
Рейтинг: 0 / 0
Помогите со структурой
    #37375797
s u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
srgio cash _table

deposit _table

credit_card_table


1) надо ли хранить это в 3-х разных таблицах?

srgioКак правильно связать transaction_table и таблицы cash _table , deposit _table, credit_card_table ?

2) если да, то XOR
...
Рейтинг: 0 / 0
Помогите со структурой
    #37375857
srgio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1) Не представляю как хранить все в одном- там разные поля.


2) да, в разных.

То есть навешивать xor ключ?


mysql не поддерживает его. Но это, похоже, вопрос в другой раздел.
...
Рейтинг: 0 / 0
Помогите со структурой
    #37375910
s u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
srgioТо есть навешивать xor ключ?


mysql не поддерживает его. Но это, похоже, вопрос в другой раздел.

пример на Оракле


Код: plaintext
1.
2.
ALTER TABLE T_ADDRESS ADD (
  CONSTRAINT C_ADDRESS_XOR
 CHECK ((  DECODE (NVL(T_PERSON_OID, 0 ), 0 , 0 , 1 )+ DECODE (NVL(T_ORGANIZATION_OID, 0 ), 0 , 0 , 1 )) = 1  ));
...
Рейтинг: 0 / 0
Помогите со структурой
    #37375924
belugin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы сделал так

transaction:
account_from

account_to

....

Account

id

type

name

CashAccount

id (FK Account)

...

...
...
Рейтинг: 0 / 0
Помогите со структурой
    #37376002
srgio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
belugin Я бы сделал так

transaction:
account_from

account_to

....

Account

id

type

name

CashAccount

id (FK Account)

...

...


Так это же тоже самое. Нет? В account id - это и есть source_id. Чтобы обеспечить целостность мы опять упираемся в XOR.
Разве нет?

Ну или можно поддерживать уникальным id в пределах CashAccount CreditCardAccount, но это не решает проблему как определить в какой таблице что хранться.


Проблема не в мапинге, а в поддержании целостности.
...
Рейтинг: 0 / 0
Помогите со структурой
    #37376006
srgio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
s u
пример на Оракле


Код: plaintext
1.
2.
ALTER TABLE T_ADDRESS ADD (
  CONSTRAINT C_ADDRESS_XOR
 CHECK ((  DECODE (NVL(T_PERSON_OID, 0 ), 0 , 0 , 1 )+ DECODE (NVL(T_ORGANIZATION_OID, 0 ), 0 , 0 , 1 )) = 1  ));


Спасибо. Но увы ограничен postgresql и mysql.

Вариант остается только один? Слить все три типа аккаунтов в одну таблицу? :(
...
Рейтинг: 0 / 0
Помогите со структурой
    #37376042
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s usrgioТо есть навешивать xor ключ?


mysql не поддерживает его. Но это, похоже, вопрос в другой раздел.

пример на Оракле


Код: plaintext
1.
2.
ALTER TABLE T_ADDRESS ADD (
  CONSTRAINT C_ADDRESS_XOR
 CHECK ((  DECODE (NVL(T_PERSON_OID, 0 ), 0 , 0 , 1 )+ DECODE (NVL(T_ORGANIZATION_OID, 0 ), 0 , 0 , 1 )) = 1  ));
Причем тут это вообще?
Топикстартер просил связь между таблицами, т.е. foreign key.
...
Рейтинг: 0 / 0
Помогите со структурой
    #37376059
srgio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksofts uпропущено...


пример на Оракле


Код: plaintext
1.
2.
ALTER TABLE T_ADDRESS ADD (
  CONSTRAINT C_ADDRESS_XOR
 CHECK ((  DECODE (NVL(T_PERSON_OID, 0 ), 0 , 0 , 1 )+ DECODE (NVL(T_ORGANIZATION_OID, 0 ), 0 , 0 , 1 )) = 1  ));
Причем тут это вообще?
Топикстартер просил связь между таблицами, т.е. foreign key.

Я так понимаю завести три поля в transaction cash_id credit_card_id и deposit_id. Вешаем ключи на сотвествующие таблицы cash credit_card и deposit. А c помощью constraint добаиваемся чтобы только одно cash_id credit_card_id и deposit_id было установлено.
Если я правльно понял s u .
...
Рейтинг: 0 / 0
Помогите со структурой
    #37376062
s u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftПричем тут это вообще?
Топикстартер просил связь между таблицами, т.е. foreign key.

мне кажется у ТС не составит труда 3 FK создать ( а может и все 6)
более интересно как описать что один и только один из этих ФКс может быть источником и только один счетом, куда средства поступили
...
Рейтинг: 0 / 0
Помогите со структурой
    #37377085
belugin4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
srgioТак это же тоже самое. Нет?
В account id - это и есть source_id. Чтобы обеспечить целостность мы опять упираемся в XOR.
Разве нет?


Насколько я понял по вашему кусочку кода, у вас в табличке Address 3 поля. Что приводит к разреженным записям и трудностям при написании унифицированного кода для работы с табличкой. Да и для расширения типа счета придется проходить по всем таблицам ссылкам и добавлять поле и дописывать constraint.


Ну или можно поддерживать уникальным id в пределах CashAccount CreditCardAccount, но это не решает проблему как определить в какой таблице что хранться.

Проблема не в мапинге, а в поддержании целостности.

Вот что я нашел для SQL server. Может так можно и на оракле?
...
Рейтинг: 0 / 0
Помогите со структурой
    #37377255
srgio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
belugin4Насколько я понял по вашему кусочку кода, у вас в табличке Address 3 поля. Что приводит к разреженным записям и трудностям


Вот сейчас что есть. Но это не правильно. Не смогу я такие fk на account_sources навесить.
...
Рейтинг: 0 / 0
Помогите со структурой
    #37377307
belugin4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
srgioВот сейчас что есть. Но это не правильно.


1. date_created и currency_id явно просятся в account_sources
2. зачем object_source_id

Не смогу я такие fk на account_sources навесить.


3. Надо наоборот, на стороне cash|credit|deposits сделать по FK на account_sources
4. Вы прочитали материал по ссылке? Поняли? Там еще добавляется в наследники по константному выражению ("тип")и делается FK по паре "тип, ID"
...
Рейтинг: 0 / 0
Помогите со структурой
    #37377318
belugin4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И связб account_sources <-- account_deposits должна быть не 0..n <- 1 а 1 <- 0..1:
для каждого account_deposits должна быть ровно 1 account_sources, но для account_sources может и не быть account_deposits
...
Рейтинг: 0 / 0
Помогите со структурой
    #37378864
srgio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
belugin44. Вы прочитали материал по ссылке? Поняли? Там еще добавляется в наследники по константному выражению ("тип")и делается FK по паре "тип, ID"
Прочитал. Давайте по порядку. А то или лыжи не еду или не сезон.

Там четыре маппинга в классы
- Map the entire class hierarchy to a single table
- Map each concrete class to its own table
- Map each class to its own table
- Map the classes into a generic table structure

Где во втором и третьем случае type?

[img=http://www.agiledata.org/images/mappingClassToTable.gif
]



Приведите вашу схему. Я как понял вы за вариант 3 (Map each class to its own table). Так будет проще, там таблицы то четыре всего. А то я вашей идеи не понимаю.

Если вы за вариант 3. То получается что вроде этого. Только я не вижу в чем соль?
...
Рейтинг: 0 / 0
Помогите со структурой
    #37381488
belugin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, нарисовал в каком-то онлайновом редакторе подобие UML.

Множественность тут такая -
---<> 1 : 0..n
<|---- 1 : 0..1

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

например, запрос "куда делись деньги со счета X" будет:

Код: plaintext
1.
2.
3.
4.
select Account.ID, Account.Type, sum([Transaction].Amount) 
    from  [Transaction] inner join Account on Account.ID = [Transaction].[To] 
    where [Transaction].[From] = :GivenID 
    group by Account.ID, Account.Type

Теперь попробуйте переписать его на другой модели.
Теперь, допустим, нам надо кешировать хранить остатки на дату в целях быстродействия. Как вы это организуете в своей модели?

...
Рейтинг: 0 / 0
Помогите со структурой
    #37381556
srgio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
beluginТеперь попробуйте переписать его на другой модели.
Теперь, допустим, нам надо кешировать хранить остатки на дату в целях быстродействия. Как вы это организуете в своей модели?



Вы лучше скажите как Вы обеспечите чтобы в account были ссылки на существующий тип поступления данных (или кэш или депозит итд ) ?

Вот в чем вопрос.

s u уже предложил через xor, его решение верное но увы только для oracle. Видимо придется это в коде делать что не есть гуд.
...
Рейтинг: 0 / 0
Помогите со структурой
    #37381581
belugin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
srgioВы лучше скажите как Вы обеспечите чтобы в account были ссылки на существующий тип поступления данных (или кэш или депозит итд ) ?

Account сылается на Type. Тут простой FK. Type мы не модифицируем. Соответственно, FK1 таблицы Account проконтролирует существование и единственность ссылки на Type. Это если понимать вашу фразу буквально.

Надо еще чтобы для Account существовала ровно 1 запись в BankAccount или CashAccount.

Не более чем единственность этой записи контроллируют PK для BankAccount, CashAccount и Account.
Соответствие типа и взаимное исключение при существования записей - FK1 для BankAccount, CashAccount и Account.

Проблема только в контроле наличия записи - можно вставить запись в Account с Type = 1 и не вставить в запись в BankAccount либо удалить запись из BankAccount.

Вот тут я не знаю точно как - за меня это делает appserver
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Помогите со структурой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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