вторник, 28 февраля 2012 г.

Регулятор отскока Manitou Nixon '05

Чертеж кноба-регулятора, в простонародии - крутилки отскока, от Manitou Nixon. Также прилагается болт. Шаг резьбы болта ориентировочно - 1.25мм (но это на глаз...).

Подходит под Stance (проверено лично). По словам экспертов ХБ - также регулятор должен подходить под Sherman и Travis... по идее, и для Gold Label тоже...


Кноб. Вид сверху.
Кноб. Вид сбоку.
Кноб. Сечение.
Болт. Вид сверху.
Болт. Вид сбоку.
3D-1.
3D-2.

четверг, 23 февраля 2012 г.

Self referencing many-to-many на MS SQL Server и Access. Особенности. Часть 2.


...продолжение

Особенности проектирования (SQL Server)
      Итак, в этом посте будут затронуты особенности построения БД с использованием связи self referencing many-to-many на SQL Server.

      Все исходные данные и условия те же, что и в первой части.

      Допустим, мы создали две таблицы (пока без ограничений FK):

USE [stones1]
GO
CREATE TABLE [dbo].[stones](
      [id] [smallint] NOT NULL,
      [name] [nvarchar](35) NOT NULL,
      CONSTRAINT [PK_stones_1] PRIMARY KEY ([id] ASC)
      )
GO
CREATE TABLE [dbo].[stf](
      [stone_id] [smallint] NOT NULL,
      [form_id] [smallint] NOT NULL,
 CONSTRAINT [PK_stf] PRIMARY KEY([stone_id] ASC,[form_id] ASC)
)
GO

Теперь наложим ограничения FK на поля отношения STF:

USE [stones1]
GO

ALTER TABLE [dbo].[stf]  WITH CHECK ADD  CONSTRAINT [FK_stf_stones_id1] FOREIGN KEY([stone_id])
REFERENCES [dbo].[stones] ([id])
ON DELETE CASCADE
ON UPDATE CASCADE
GO

ALTER TABLE [dbo].[stf]  WITH CHECK ADD  CONSTRAINT [FK_stf_stones_form1] FOREIGN KEY([form_id])
REFERENCES [dbo].[stones] ([id])
ON DELETE CASCADE
ON UPDATE CASCADE
GO

      При попытке выполнить эти пакеты вы получите сообщение об ошибке следующего вида:


Или, если задавать FK в конструкторе – то приблизительно такое сообщение:


      Как видим – SQL Server не позволяет спроектировать БД подобным образом :( …

      Согласно информации по референсу http://support.microsoft.com/kb/321843/en-us?fr=1, (далее практически дословно) вы получаете ошибку  1785 потому, что в СУБД SQL Server таблица не может появляться более одного раза  в  списке всех каскадных ссылочных действий, которые являются результатом вызова инструкций DELETE или UPDATE.

     Более продвинутые в MS SQL гуру на RSDN (http://www.rsdn.ru/forum/db/3081247.flat.aspx) обьясняют это спецификой алгоритма определения циклов от мелкомягких, и это безобразие тянется еще с 2000 года, и менять никто ничего принципиально не собирается (конечно, лезть в старый код и переписывать рабочий  алгоритм, со всеми вытекающими… я б сам не стал :))

Кто виноват, и что делать?
     Очевидно, что это упущение разработчиков мелкомягких. Ведь поддерживание  целостности данных на максимально возможном уровне – одна из основных задач СУБД и она определена в стандарте ANSI/ISO. В данном случае, стараниями разработчиков, этот максимум занижен путем наложенного ограничения функционала СУБД (видимо, перестарались). Можно конечно возразить, что конкретные реализации условий целостности отличаются в разных СУБД, но “отличная от иной реализация” и отсуствие реализации” – это разные вещи.

      Решение данной проблемы саппорт целиком и полностью возлагает на наши плечи :) (в том-же референсе предлагается использовать триггеры в случае необходимости обесппечения целостности и максимальной гибкости). То же решение предлагается и на RSDN, и на SQL.RU (http://www.sql.ru/forum/actualthread.aspx?tid=595772).

Каковы будут наши дальнейшие действия?
      Сначала необходимо все-таки наложить ограничения внешнего ключа на отношение STF. Для этого необходимо убрать из вышеприведеного листинга для FK правила обновления\удаления и выполнить запрос. После этого, не мудрствуя лукаво,  пишем триггеры.

     Итак, для успешного удаления записи из таблицы STONES мы должны сначала обработать таблицу STF, так как у нас наложены ограничения внешних ключей с  правилами обновления и удаления RESTRICT (по умолчанию), и в случае непосредственной попытки выполнить инструкцию DELETE - мы получим сообщение об ошибке.

Простейший возможный сценарий работы триггера можно составить таким образом:
 - Проверить количество связанных дочерних записей в таблице STF и в случае успеха – удалить.
 - Проверить количество связанных родительских записей в таблице STF и в случае успеха – также удалить.
 - Удалить запись таблицы STONES

USE [stones1]
GO

CREATE TRIGGER [dbo].[trg_stones_IOD] ON [dbo].[stones]
INSTEAD OF DELETE
AS
BEGIN

      SET NOCOUNT ON
IF(SELECT COUNT(*) FROM stf, deleted WHERE stf.stone_id=deleted.id)>0
      BEGIN
            DELETE stf FROM stf, deleted WHERE stf.stone_id=deleted.id
      END
     
      IF(SELECT COUNT(*) FROM stf, deleted WHERE stf.form_id=deleted.id)>0
      BEGIN
            DELETE stf FROM stf, deleted WHERE stf.form_id=deleted.id
      END
   
    DELETE stones FROM stones,deleted WHERE stones.id=deleted.id
   
END
GO

      Триггер для обновления INSTEAD OF UPDATE пишется аналогичным образом и здесь я его приводить не буду.

      Вот и все. Мы добились требуемой архитектуры БД с использованием связи many-to-many и каскадным удалением\обновлением данных.



понедельник, 20 февраля 2012 г.

Демпфер для Stance Flow '05

Чертеж демпфера FFD (Fluid Flow Damping system) для Manitou Stance Flow 120/150. Под 32-е ноги.

Вид сверху.
Вид сбоку.
Сечение А.
Сечение В.
Сечение С.
3D-1.
3D-2.

среда, 15 февраля 2012 г.

Утилита BatchAccess для MS Access

     BatchAccess - это утилита, написанная под .NET Framework, которая позволяет расширить основные возможности разработчиков по работе с БД MS Access на "низком уровне", то есть - на уровне SQL скрипта.

      Разработчик - Русские Информационные Технологии.
      Сайт - http://www.russianit.ru/software/batchaccess/
      Мне посчастливилось :) работать с версией - 1.4.


      На мой взгляд - довольно полезная вещь. MS Access можно назвать визуально-ориентированной средой проектирования, ведь любой, кому приходилось работать с Access знает, что большая часть процесса проектирования БД реализована посредством работы с пользовательским интерфейсом. Основной недостаток такого подхода к проектированию - часть "кухни" скрыта от разработчика, то есть - физически невозможно получить доступ к SQL коду при выполнении тех или иных манипуляций. В общем, кто работал с Access - те в курсе о чем идет речь.

     Итак, BatchAccess позволяет работать с БД более привычным образом, посредством выполнения SQL-операторов.

Требования
      Для работы приложения требуется соответственно предустановленный .NET Framework (на сайте заявлена минимальная версия .NET Framework 1.1), MDAC и Microsoft Jet Driver 4.0. Наличие самого MS Access, естественно, не требуется.
      Как видно - весьма непритязательные требования к ПО.

Возможности
      Утилита позволяет работать как через консоль, так и через пользовательский интерфейс.
Среди заявленных возможностей по работе с БД присутствуют: создание БД, выполнение скриптов над БД, работа со структурой и данными (создание\получение), экспорт в CSV-файл и др.

Вьювер. Структура БД.

    Работа
      Лично я использовал BatchAccess для получения структуры БД. Используя программный интерфейс это можно сделать следующим образом:

  1) Для того, чтобы открыть существующую БД необходимо выполнить команду меню Database → Select Database и выбрать соответствующий *.mdb-файл в появившемся FileOpenDialog.
  
  2) Далее, для экспорта структуры БД в *.sql-файл необходимо выполнить команду меню Database → Restore Structure Script и, соответственно, задать имя файла в появившемся диалоге.
  
  3) После этого можно открыть *.sql-файл (меню File → Open) и посмотреть скрипт.

sql-скрипт. Структура БД.
      
      На RSDN - http://www.rsdn.ru/article/files/progs/BatchAccess.xml присутствует обширное описание всех остальных возможностей программы, и исчерпывающее описание работы с консольной версией.

вторник, 14 февраля 2012 г.

Self referencing many-to-many на MS SQL Server и Access. Особенности. Часть 1.

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

self referencing many-to-many
       Речь пойдет о проектировании структуры БД состоящей из двух таблиц с использованием связи self referencing many-to-many для одной таблицы, и вспомогательной таблицы взаимосвязей типа предок-потомок (если из вышенаписанного ничего не ясно – дочитайте до начала иллюстраций :)). Плюс при всем этом - будут затронуты нюансы обеспечения целостности данных (каскадное удаление\обновление) зависящие от конкретной используемой "платформы".
     Нужно отметить, что данная проблема слабо освещена в сети, и объяснение некоторых нюансов работы конкретной СУБД Access мне так и не удалось найти, возможно, в силу того, что подобные ситуации редко возникают в повседневной практике разработки БД.

Постановка задачи
      Итак, сформулирую рабочую задачу на абстрактном примере:
  Допустим, мы имеем сущность предметной области – минерал. Для максимального упрощения примера, эта сущность будет характеризоваться своим названием и принадлежностью к определенному виду или разновидности. Известно, что каждый минерал может быть:
а) отдельным минеральным видом
б) минеральной разновидностью для одного или (внимание!) нескольких минеральных видов.

     Каким образом можно спроектировать БД, для хранения информации о минералах с учетом ограничений определенных условиями, и обеспечить целостность данных?

Проектирование (Access)
       Исходя из описанных выше условий, можно сделать абсолютно ясный логический вывод о том, что оперировать придется однотипными сущностями.
     Так как и минеральные виды и разновидности – это сущности одного типа, то для хранения информации о них необходимо одно отношение STONES, в котором будут определены поля id, и name. Для хранения информации о взаимосвязях (предок-потомок) между минералами необходимо отношение MTF (сокр. – minerals to forms) с полями stone_id, form_id. Ограничения накладываемые условиями предметной области не позволяют нам использовать еще одно дополнительное поле в таблице STONES для характеристики взаимосвязей между минералами, (так как один минерал может быть предком для нескольких потомков и, в свою очередь, один потомок может иметь нескольких предков), поэтому необходимость наличия отдельного отношения взаимосвязей является абсолютно очевидной.


     Прежде чем перейти к SQL Server, я спроектирую эту БД на Access, чтобы можно было убедиться в возможности построения такой структуры отношений.

   Итак, у нас имеется два отношения STONES и MTF. Целостность отношения MTF обеспечивается составным PK из соответствующих полей stone_id и form_id . Каждая запись в таблице будет уникальной. Отношение STONES будет иметь PK на поле id.

   После завершения проектирования структуры БД можно перейти к схеме данных и приступить к проектированию связей между отношениями. Ссылочная целостность отношений MTF и STONES обеспечивается ограничением FK для каждого из двух полей отношения MTF на PK отношения STONES, однозначно идентифицируя взаимоотношения предок-потомок между ключевыми сущностями.


     После определения последнего из двух FK для отношения MTF мы увидим следующую ужасающую картину:



      Как говорят буржуи: оО WTF? Смотрим код.


CREATE TABLE stf (
    form_id                 Long NOT NULL,
    stone_id                Long NOT NULL,
    CONSTRAINT PrimaryKey PRIMARY KEY (stone_id, form_id)
);

CREATE TABLE stones (
    id                      Long NOT NULL,
    stone_name              Text(80) WITH COMP,
    CONSTRAINT PrimaryKey UNIQUE (id),
    CONSTRAINT PrimaryKey1 PRIMARY KEY (id)
);
  
ALTER TABLE stf
    ADD CONSTRAINT stonesstf FOREIGN KEY (form_id) REFERENCES stones
ON UPDATE CASCADE
ON DELETE CASCADE;


ALTER TABLE stf
    ADD CONSTRAINT stonesstf1 FOREIGN KEY (stone_id) REFERENCES stones
ON UPDATE CASCADE
ON DELETE CASCADE;

        Что же это за таблица STONES_1? Дубликат отношения STONES? Судя по коду – вроде бы нет. В общем, я так и не разобрался, что это за безобразие.
      Лично мне до какой-то степени не очень интересно сколько таблиц нужно нарисовать, чтоб отобразить ограничение внешнего ключа на схеме данных, но любой здравомыслящий проектировщик начнет седеть раньше времени если такое увидит…
Ситуацию удалось немного прояснить следующим образом:



      Я просто разбил отношение STONES на два отношения – STONES и STONEFORMS со связью между ними one-to-one. Как видно по диаграмме, тут все обошлось без фокусов и, видимо, дополнительная таблица на предыдущей диаграмме – это специфика Access-а.
      
      Но самое важное здесь не то, каким образом происходит отображение связей, а то - как они обеспечивают целостность данных. Как видно из листинга кода, ограничения внешних ключей определены с правилами обновления\удаления CASCADE. ч.т.д.

Итог по Access-у
    Итак, как можно видеть, Access позволяет проектировать подобную структуру БД с обеспечением каскадного обновления и удаления данных, чего не скажешь о SQL Server.

Продолжение во второй части...

понедельник, 6 февраля 2012 г.

SQL Server Migration Assistant

MS SSMA
      Microsoft SQL Server Migration Assistant for Access – это бесплатная утилита от Microsoft, которая предназначена для автоматизации процесса миграции БД и переноса данных БД MS Access на MS SQL Server.

       Ознакомиться подробнее и загрузить можно здесь - http://www.microsoft.com/sqlserver/en/us/product-info/migration.aspx

      Последняя версия на момент написания поста - 5.1.1105. В данной версии реализована поддержка миграции БД со всех доступных на сегодняшний день версий Access, начиная с MS Access 97, на версии: SQL Server 2005, SQL Server 2008, SQL Server 2008 R2, SQL Server 2012 и SQL Azure.
      Кроме решения для Access на сайте можно загрузить версии SSMA поддерживающие миграцию для Oracle, MySQL, Sybase.
Требования
      Инструмент разработан для платформ от Windows XP до Windows 7. Для работы необходимо наличие предустановленых Microsoft Windows Installer 3.1, .NET Framework  2.0, DAO 12.0 или 14.0.

Работа
      Работать с SSMA довольно просто. Присутствует интуитивно-понятный информативный пользовательский интерфейс.
      Перед началом работы с SSMA необходимо создать пустую БД на SQL сервере, в которую будет переноситься исходная БД MS Access.

      Простейший сценарий работы можно описать в следующем виде:

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


      Далее – открыть БД MS Access с помощью кнопки “Add Databases” путем открытия .accdb-файла. После открытия, метаданные выбраной БД отобразятся в соответствующем обозревателе.


      Следующий шаг – коннект к экземпляру SQL Server с помощью соответствующей кнопки на панели инструментов. После установки соединения выбраный экземпляр SQL Server отобразится в соответствующем обозревателе метаданных.


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


      Результат процесса конвертации (ошибки/предупреждения/сообщения) отобразится в окне “Output”.
      Далее – неоходимо непосредственно создать все таблицы, представления, триггеры и т.д., которые описаны и загружены в схему создаваемой БД SQL Server. Этот процесс также автоматизирован. В окне метаданных SQL Server необходимо раскрыть ветки: “Ваша БД” ”Schemas” “dbo” “Tables“. Отметить ветку “Tables“ и выбрать в ее контекстном меню пункт  ”Synchronize with Database”.
      После этого появится окно синхронизации. Результат процесса синхронизации (ошибки/предупреждения/сообщения) отобразится в окне “Output”.


      После этого этапа у вас уже будет готовая структура БД без данных.
      Для заполнения созданой БД данными необходимо отметить ветку с названием вашей БД в окне метаданных Access, после чего станет активна кнопка “Migrate Data” панели инструментов (или выбрать соответствующий пункт в контекстном меню отмеченной ветки). Отобразится окно результатов переноса данных.


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


суббота, 4 февраля 2012 г.

Топкеп для Dirt Jumper 2

Чертеж топкепа для Marzocchi Dirt Jumper 2 08'. Без нипеля подкачки, под ноги - 32мм.

Вид сверху.


Вид сбоку.


3D - 1

3D - 2