Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рельсо-ориентированная БД, Помогите спроектирвать 
:(
    Опции темы
BobiKK
Дата 28.4.2008, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 655
Регистрация: 1.12.2005
Где: Essen, Deutschlan d

Репутация: нет
Всего: 16



В двух словах задача:
придумать структуру БД для многоязычного каталога алкогольной продукции

Посидев немного и пораскинув мозжечком получается что-то вроде этого:
Код

CREATE TABLE `languages` (                                
             `id` int(11) NOT NULL auto_increment,                   
             `shortname` varchar(255) default NULL,                  
             `fullname` varchar(255) default NULL,                   
             PRIMARY KEY  (`id`)                                     
           )

CREATE TABLE `countries` (                                
             `id` int(11) NOT NULL auto_increment,                   
             `country_id` int(11) default NULL,                      // идентифицирует страну
             `language_id` int(11) default NULL,                   // определяет язык (таблица languages) информативных полей (name, shortname)
             `name` varchar(255) default NULL,                       
             `shortname` varchar(255) default NULL,                  
             PRIMARY KEY  (`id`)                                     
           ) 

CREATE TABLE `tastes` (                                  
          `id` int(11) NOT NULL auto_increment,                  
          `taste_id` int(11) default NULL,                        // идентифицирует вкус
          `language_id` int(11) default NULL,                 // идентифицирует язык
          `description` varchar(255) default NULL,         // поле с информцией
          PRIMARY KEY  (`id`)                                    
        ) 
CREATE TABLE `wines` (                                    
          `id` int(11) NOT NULL auto_increment,          // записи здесь уникальные           
          `country_id` int(11) default NULL,                  // внешний ключ, поле `country_id` в таблице countries (не `id`)        
          `colour` int(11) default NULL,                          
          `degree` decimal(2,2) default NULL,                     
          `year` int(11) default NULL,                            
          `taste_id` int(11) default NULL,                    // внешний ключ, поле `taste_id` в таблице tastes
          `price` decimal(6,2) default NULL,                      
          `image` blob,                                           
          PRIMARY KEY  (`id`)                                     
        )

Я с рельсами только знакомлюсь и пока не нахожу возможности задать отношение belongs_to :taste или :country в модели Wine. Связывание должно по идее происходить так: wines.id_taste = tastes.id_taste AND language_id = 1. Т.е. запись идентифицируется по 2 ключам Реализовать это в рельсах, я так понял, трудновато.
Как адаптировать структуру под рельсы? Вариант типа разделить tastes на 2 таблицы (1ая: `id`, 2ая, `taste_id`, `language_id`, `description`) возможно бы и прокатил, но городить лишнюю таблицу ради одного поля как-то не хочется
PM MAIL   Вверх
source777
Дата 28.4.2008, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 56



А нафига в таблице countries два(id и country_id) "первичных" ключа, что за дикий изврат такой?

Ты можешь указать несколько объявлений belongs_to для модели типа:
Код

class Wine < ActiveRecord::Base
  belongs_to :tastes
  belongs_to :countries
end

Поэтому я не понял в чём возникла сложность?


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
BobiKK
Дата 28.4.2008, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 655
Регистрация: 1.12.2005
Где: Essen, Deutschlan d

Репутация: нет
Всего: 16



Вот что под этим подразумевалось
Код

id                country_id  language_id             name
1                 1                 1                             Франция
2                 1                 2                              France
3                 1                 3                              Frankreich

4                 2                 1                             Германия
5                 2                 2                             Germany
6                 2                 3                             Deutschland


belongs_to :tastes будет работать, если связывание идет по `id`. У меня же не `taste_id`
PM MAIL   Вверх
source777
Дата 29.4.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 56



Цитата(BobiKK @  28.4.2008,  23:58 Найти цитируемый пост)
belongs_to :tastes будет работать, если связывание идет по `id`. У меня же не `taste_id` 
Не, ну не гони. belongs_to - штука вполне себе настраиваемая во всех деталях. В частности можно явно указать имя внешнего ключа:
Код

belongs_to :tastes,
      :foreign_key => "taste_id" # по умолчанию тут "id"


P.S. Мне кажется легче было бы организовать мультилингвальность путём использования разных таблиц для разных языков, отличающихся языковым префиксом, тогда переход между языками будет осуществляться к примеру так:
Код

config.active_record.table_name_prefix = "ru_"

Можно также настроить автоматическую смену языка на базе routes, путём установки нужного префикса таблиц, в зависимости от части URL, или даже поддомена...


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
shine
Дата 29.4.2008, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 20.10.2006

Репутация: нет
Всего: 5



1)Та же проблема о которой говорил source777 и для таблицы tastes: поле tastes_id не нужно
2)Для языков 11 позиций много. 3 хватит с головой. Для года создания вина хватит 4 позиции.
3)Файлы рисунков лучше хранить все-таки не в БД, а в ФС.
--------------------
An investment in knowledge always pays the best interest. © Benjamin Franklin
PM MAIL   Вверх
BobiKK
Дата 29.4.2008, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 655
Регистрация: 1.12.2005
Где: Essen, Deutschlan d

Репутация: нет
Всего: 16



Код
belongs_to :tastes,
      :foreign_key => "taste_id" # по умолчанию тут "id"

По умолчанию, если не ошибаюсь, как раз taste_id. :foreing_key указывает наименование ключа в текущей таблице, а мне помимо этого надо установить другой ключ в `tastes`.

Код
config.active_record.table_name_prefix = "ru_"

Это ведь глобальная настройка для всех таблиц, а у меня далеко не все многоязычные. Или вы предлагаете передавать моделям какой-нибудь параметр 'lang' и уже в зависимости от него выставлять self.table_name?

Цитата
Файлы рисунков лучше хранить все-таки не в БД, а в ФС. 

Сам всегда так делаю. Но здесь надо будет проводить автоматические обновления и проще это делать с БД.

Цитата

Та же проблема о которой говорил source777 и для таблицы tastes: поле tastes_id не нужно

Что взамен?
PM MAIL   Вверх
source777
Дата 29.4.2008, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 56



Цитата(BobiKK @  29.4.2008,  13:45 Найти цитируемый пост)
:foreing_key указывает наименование ключа в текущей таблице
Не в текущей, а в той которой внешний ключ, т.е. в данном случае в `tastes`.

Цитата(BobiKK @  29.4.2008,  13:45 Найти цитируемый пост)
Это ведь глобальная настройка для всех таблиц, а у меня далеко не все многоязычные. Или вы предлагаете передавать моделям какой-нибудь параметр 'lang' и уже в зависимости от него выставлять self.table_name?
Модели не зачем этим напрягать, тут роуты отлично справятся с тем, какой язык нужен на запрашиваемой странице... Выставлять имена таблиц не нужно, это происходит прозрачно для модели, при назначении префикса...



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
shine
Дата 29.4.2008, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 20.10.2006

Репутация: нет
Всего: 5



Цитата(BobiKK @ 29.4.2008,  13:45)
Цитата

Та же проблема о которой говорил source777 и для таблицы tastes: поле tastes_id не нужно

Что взамен?

У тебя уже есть в таблице tastes поле id. Именно оно и должно быть уникальным идентификатором объекта. Рельсы именно так и связывают: wines.taste_id = taste.id
--------------------
An investment in knowledge always pays the best interest. © Benjamin Franklin
PM MAIL   Вверх
source777
Дата 29.4.2008, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 56



Цитата(shine @  29.4.2008,  21:15 Найти цитируемый пост)
Рельсы именно так и связывают: wines.taste_id = taste.id 
Рельсы связывают так как им скажешь, а то что ты написал, это лишь соглашение по конфигурации, которое применяется по умолчанию...



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
shine
Дата 29.4.2008, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 20.10.2006

Репутация: нет
Всего: 5



... выкушено автором после размышлений по теме ...

Это сообщение отредактировал(а) shine - 29.4.2008, 22:50
--------------------
An investment in knowledge always pays the best interest. © Benjamin Franklin
PM MAIL   Вверх
BobiKK
Дата 29.4.2008, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 655
Регистрация: 1.12.2005
Где: Essen, Deutschlan d

Репутация: нет
Всего: 16



Цитата(shine @  29.4.2008,  21:15 Найти цитируемый пост)
У тебя уже есть в таблице tastes поле id. Именно оно и должно быть уникальным идентификатором объекта. Рельсы именно так и связывают: wines.taste_id = taste.id 

По рельсовой логике - да. Но у меня получается некое подобие составного ключа из полей taste_id и language_id


Цитата(source777 @  29.4.2008,  14:38 Найти цитируемый пост)
Не в текущей, а в той которой внешний ключ, т.е. в данном случае в `tastes`.

Почему-то я всегда считал, что в belongs_to как раз и есть внешний ключ. И почему-то у меня это до сих пор работало smile

Цитата(source777 @  29.4.2008,  14:38 Найти цитируемый пост)
Выставлять имена таблиц не нужно, это происходит прозрачно для модели, при назначении префикса...

А можно хотя бы намек, что гуглить? smile Как сделать параметры текущего языка в руотингах кое-как понятно,  но вот как это связать с моделями - теряюсь в догадках
PM MAIL   Вверх
source777
Дата 30.4.2008, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 56



Цитата(BobiKK @  29.4.2008,  23:38 Найти цитируемый пост)
А можно хотя бы намек, что гуглить?
Что там гуглить, вся дока вместе с рельсами устанавливается RDoc называется... 

Цитата(BobiKK @  29.4.2008,  23:38 Найти цитируемый пост)
Как сделать параметры текущего языка в руотингах кое-как понятно,  но вот как это связать с моделями - теряюсь в догадках 
Никак с моделями связывать не надо, я ж говорю это для них прозрачный момент. Просто не указывай в имени модели никаких префиксов и всё будет работать... 




--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
BobiKK
Дата 4.5.2008, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 655
Регистрация: 1.12.2005
Где: Essen, Deutschlan d

Репутация: нет
Всего: 16



Что ж, спасибо всем за помощь, вроде кое-как разобрался.

P.S. А документация у рельсов неудобная. По крайней мере у ZF на порядок лучше
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Ruby: Базы данных | Следующая тема »


 




[ Время генерации скрипта: 0.1397 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.