Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Какие могут быть минусы от использования общего SEQ в нескольких таблицах?

У меня в схеме несколько десятков таблиц для различных задач.
В этих таблицах есть триггеры на добавление записи, чтобы автоматически проставлять PK.
Можно ли использовать одну SEQUENCE во всех таблицах?
Или лучше для каждой создавать отдельную?
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
Ответ: Вообщем сделал общий SEQ на группу таблиц, логически принадлежащих одной категории.
Сбрасывать последовательность мне не нужно, и ничего страшного или некрасивого нет в том, что PK соседних записей будет сильно отличаться.
Хотя я и согласен с тем, что красивые решения обычно являются правильными.
Вопрос: Общий подход при работе с зависимости от таблицы

Добрый день!

Снова со своими вопросами. :) Сорри, не очень придумал как топик назвать.

Вот предположим, есть движок форума. В нем функция, принимающая ответ в тему. Нужно проверить входящие данные, тра-та-та, и есть еще целый ряд прав на действие. Например, нельзя постить ответ в закрытую тему. Обычно изначально выбираются данные из БД, и потом идет проверка на языке движка форума а-ля if ($result['closed'] == 0)... А бывает идет запрос с условием вида closed=0, и т.д.... Суть в том, что мы сначала проверяем возможность/допустимость добавления ответа в тему, а лишь затем приступаем непосредственно к самому добавлению. Очевидно, что в промежутке между такой проверкой и собственно самим добавлением ответа в тему, эта тема вполне может быть закрыта.

Конечно, в случае с форумом такое крайне маловероятно, и даже если произойдет - это вообще ерунда. Но форум тут число дли наглядной иллюстрации сути вопроса.

В общем, как быть в такой ситуации, когда мы имеем дело со вставкой / изменением / удалением данных в БД, когда возможность данной операции определяется некоторыми значениями в некоторых таблицах этой БД, и мы хотим быть уверенными в целостности структуры БД после выполнения таких действий?
Ответ:
Akina, но ведь между этими системами хранения есть отличия, которые надо учитывать. Готовый большой проект, все работает на MyISAM. Если просто поменять MyISAM -> InnoDB, 100% полезут глюки, надо учитывать структуру БД, запросы, логику...

Добавлено через 5 минут и 20 секунд
Навскидку вот такой даже примитив  и уверен есть куча подводных камней. А опыта работы с InnoDB у меня 15 минут. :)

Есть один проект, там CMS самописная (не моя) простая небольшая. Стоит на VPS, который быстренько поднял с полностью чистого образа. Проект небольшой, нагрузка - слезы. Через неделю после поднятия начались глюки - БД висла. Нагрузка минимальная, top показывает avg. 0.05 примерно - чтоб понимали. Начал копаться. Кароче там какой-то баг был из-за того, что в системе не было своп-файла. Так там нагрузка минимальна, 2Гб ОЗУ - зачем своп??? Подключил своп 2Гб, эти глюки пропали. Со временем появились новые. Уже не помню что там было, копался-копался, исправил. Потом еще что-то. Теперь опять БД временами виснет. Почему - непонятно. С MyISAM таких проблем нет. Примитивно, просто, но хорошо.
Вопрос: Работа с таблицей метаданных и блокировка полей в ней

В теме MultiUsers Access base разговора Вами было сказано:... "Вариантов решения задачи много. Я обычно использую таблицу метаданных, где есть поля имени формы, имени контрола, типа доступа (Enable, Visible, Locked) и перечисления ролей, для которых контрол должен иметь данный доступ. При загрузке формы, делается запрос на таблицу метаданных с именем формы, в цикле обходятся контролы и им присваивается тип доступа согласно роли юзера, открывшего форму".
Могли бы вы пример кода (если есть) дать на рассмотрение к вышеизложенному описанию, ПОЖАЛУЙСТА?
Не совсем понятно, что имеется ввиду под "контролами"? и как создается сама таблица метаданных, это необычная таблица с ссылками?
Ответ:
Aleks777, А не лучше делать через глобальную переменную?
а всё и сделано через неё ( она объявлена в общем модуле ), когда входите в программу через логиницу, в переменную записывается вошедший пользователь.

а если дальше открывать другие формы
делаете так:
Visual Basic
1
2
3
Private Sub Form_Load()
    Call setRight(Me)
End Sub
ну и соответственно в таблице tblRolesRight должны быть записаны все контролы для формы, которую открываете
Вопрос: Как организовать работу с таблицей связанной с самой сабой

Есть таблица "Человек", с атрибутами (кроме всего прочего) мать и отец. Это ссылки на данные из этой же таблицы.
Хотелось бы организовать работу с данными этой таблицы через форму.
Пока проблема в заполнении данных отцов. У меня это субформа. Первоначально ссылка на мать/отца равна 0 или отсутствует. Заполнять руками не хочется, но если источником субформы ставить запрос - то как связать с главной таблицей и отображать уже введённые данные при открытии?

Возможно, всё это очень просто, но до меня, почему-то не доходит.
Ответ:
Сообщение от Aleator
но если источником субформы ставить запрос - то как связать с главной таблицей и отображать уже введённые данные при открытии?
Возможно, всё это очень просто, но до меня, почему-то не доходит.
У вас просто психологический блок. Между работой и двумя разными таблицами (главная и зависимая) и одной и той же таблицей, выступающей и в роли главной, и в роли зависимой - разницы существенной нет. В запросах для наглядности просто используйте псевдонимы.

SQL
1
2
3
SELECT Человек.*, Мать.*, Отец.*
FROM (Человек LEFT JOIN Человек AS Мать ON Человек.МатьID = Мать.ID) 
    LEFT JOIN Человек AS Отец ON Человек.ОтецID = Отец.ID
Left Join - чтобы выводить и тех людей, у которых свдеения о родителях не заполнены.

Добавлено через 4 минуты
Сообщение от Aleator
Пока проблема в заполнении данных отцов. У меня это субформа.
Субформа хороша для той идеи, которую описал PuhKMV: перечислить много родственников, указать степень родства.

Но если не стоит задача перечислять много родственников, а только мать и отца - то на мой взгляд два поля со списком (в одном вводим мать, в другом отца) - проще.

Добавлено через 2 минуты
А вот для ДЕТЕЙ сделать субформу как раз логично.
Вопрос: Общие данные для 2х таблиц

Доброго времени.
Помогите вот с таким вопросом. В одной БД есть 2 таблицы:


Хочется провернуть такую штуку, чтобы при вставке в поле таблицы "ДОСТАВКА" ФИО получателя, остальные данные из таблицы "Получатели" автоматически подставлялись.
Вопрос: как?

Сколько не ползал, сам решить не смог.
Ответ:
Сообщение от Слава лалка
чтобы при вставке в поле таблицы "ДОСТАВКА" ФИО получателя, остальные данные из таблицы "Получатели" автоматически подставлялись.
Это задание для запроса, в таблицах этого не делают. Если таблицы связаны, то это очень просто получится вытягиванием полей.
А если это для формы, то это другая задача (данные в таблицы вводятся через формы). Уточните
Вопрос: Access и PostgreSQL: подключение к БД, работа с таблицами

Доброго времени суток!

Возникла необходимость научиться работать через элементы управления, созданные в Access 2013 с PostgreSQL.

Для начала решил подключиться к БД и присоединить из нее тестовую пустую таблицу.

Что сделано:
  • Сервер PostgreSQL работает (на удаленном компе).
  • ODBC-драйвер на моем компе установлен.
  • PGAdmin с моего компа и сервер и базу и таблицу в ней видит.
  • Тест соединения из "Администратора источника данных ODBC" выдает положительный ответ.

Что не так:
При попытке подключиться (действие повешено на одну из кнопок) выдает ошибку 3151 "ODBC - ошибка подключения к PostgreSQL35W"

Код, который затыкается на последней строке (хотя дело явно не в ней):
Visual Basic
1
2
3
4
    Set NewTableDef = CurrentDb.CreateTableDef("From_PGSQL")
    NewTableDef.Connect = "ODBC;DSN=PostgreSQL35W;DATABASE=pgtest;SERVER=!!!ИМЯСЕРВЕРА!!!;UID=pgtest;PWD=пароль;"
    NewTableDef.SourceTableName = "tt01"
    CurrentDb.TableDefs.Append NewTableDef
PostgreSQL35W - название DSN в настройках источников данных ODBC
!!!ИМЯСЕРВЕРА!!! - на самом деле на это место ставилось имя сервера из PGAdmin'a или имя компьютера, на котором запущен PostgreSQL, что на результате не сказалось.
tt01 - таблица в базе данных pgtest.
From_PGSQL - наименование будущей подсоединенной таблицы в Access (если я все верно понял - оно может быть произвольным, в разумных пределах, пробовал дать имя соответствующее имени в PostgreSQL - tt01 - те же грабли).

Что я делаю не так?
Ответ: Уважаемый alvk!
Цитирую продолжение своего предыдущего сообщения: "После установки дополнительно 32-битной версии ручное подключение к БД и ее подключение в Excel заработало."
А вот проблема программного подключения посредством VBA никуда не делась.
Вручную таблица линкуется, после того, как приликнованную таблицу вручную же удалишь (так быстрее) - начинает работать и программная линковка.
Если прилинкованную таблицу удалить и перезапустить Access - снова не линкуется.
Если прилинкованную таблицу не удалять, перезапустить Access, удалить прилинкованную таблицу - снова не линкуется.
Если прилинкованную таблицу не удалять, перезапустить Access, открыть и закрыть прилинкованную таблицу, затем удалить прилинкованную таблицу - программный линк работает.

Понять что ручная линковка делает такого, что не получается сделать программно не получается.

Добавлено через 13 минут
Уважаемые коллеги, всем спасибо за помощь!

Оказалось проблема в двух моментах:
1) Версия ODBC драйвера - должна соответствовать битности Access (из-за этого была масса глюков)
2) Совершенно дурацкая ошибка с моей стороны - не учел регистр при наборе пароля После ручного подключения, видимо, где-то сохранялась информация о том, что правильный пароль был введен.

Проблема решена, тему можно закрывать.

Добавлено через 6 минут
Кому интересно - код:
Visual Basic
1
2
3
4
    Set NewTableDef = CurrentDb.CreateTableDef("tt01")
    NewTableDef.Connect = "ODBC; DSN=PostgreSQL; SERVER=ИмяСервера; DATABASE=pgtest; UID=pgtest; PWD=Пароль;"
    NewTableDef.SourceTableName = "tt01"
    db.TableDefs.Append NewTableDef
DSN отличается от предыдущего, т.к. создан новый.
Пароль теперь с большой буквы.
Все. Всем спасибо!
Вопрос: Сжатие данных при хранении и чтении файла из таблицы

Доброго времени суток.
Имеется таблица в которой в формате varbinary хранятся файлы.
Необходимо как-то уменьшить объем передаваемых данных между сервером-клиентом, т.к. клиенты подключаются к серверу через интренет и чтение файлов занимает длительно время (читается порядка 50Мб), что сказывается на общем времени работы.
Можно ли хранить файлы сжатыми или каким-либо другим образом уменьшить объем чтения
Ответ: Эта проблема, в общем-то, не имеет отношения к SQL базам данных.
Вопрос: Кэширование таблиц в MySQL

Приветствую участников форума!

Решил обратиться к вам за помощью. MySQL сильно грузит диск на сервере. Исxодные данные...

Сам сервер...
Картинка с другого сайта.

Типы запросов...
Картинка с другого сайта.

Размер баз данныx ~12ГБ.

MySQL пожирает IO, в результате чего на сервере сильно растет LA. При этом большая часть оперативной памяти остается не занятой. Обращался в компанию, специализирующуюся на администрировании и настройке серверов. Провели настройку...
автор
(размеры буферов, кэширование запросов, работу с таблицами, работа с временными таблицами в оперативной памяти)


Проблема осталась. Пробовал сам увеличивать кэш таблиц, запросов, до большиx значений. Улучшений нет. Вопрос: как перенести активность мускула в оперативную память, чтобы он перестал долбить несчастные диски?
Ответ:
miksoft
Вот поэтому и нужно смотреть запросы и индексы.
MyISAM не умеет кэшировать содержимое таблиц, а только индексов. Поэтому запросы желательно строить так, что в содержимое самих таблиц они лазили по минимуму, а лучше совсем не лазили.


Огромное упущение разработчиков. При современныx конфигурацияx серверов, было бы очень кстати.

Как вариант - подумать насчет покрывающих индексов.


Не знал о существовании такиx, так что спасибо за инфу. Попробую что-то сделать в этом направлении.
Вопрос: Динамические данные в таблицах

Ребят, привет! Я никак не могу разобраться, прошу помощи.

У меня есть таблица Склад. В ней следующие строки:

Код_продукта
Продукт
Количество

Есть так же таблица "Закупка". В ней следующие строки

Код_закупки
Код_продукта
Количество

И третья таблица "Продажи". В ней следующие строки:

Код_продажи
Код_продукта
Количество

Мне необходимо сделать так, чтобы всякий раз, когда я делаю закупку и вбиваю ее в базу данных, то оно прибавлялось к общему количеству продуктов в таблице "Склад". И наоборот, если я осуществляю продажу какого-то продукта, то сделать так, чтобы оно вычитало с таблицы "Склад".

Помогите, а )

Спасибо!
Ответ: таблица склад может служить для хранения остатков на начало года, чтобы не хранить приходы/расходы предыдущих лет
Вопрос: Посчитать общее количество дубликатов в таблице

Есть таблица, в которой содержится некоторое количество дубликатов. Для их отображения я написал запрос:
SELECT ip, mac, pcname, COUNT(*) FROM changes
GROUP BY ip, mac, pcname HAVING COUNT(*)>1


Хотелось бы посчитать общее количество дубликатов, а не отдельно по группам, как для этого можно переформировать запрос?
Ответ: Пробовал, но не понимаю, как потом группировку сделать.Написал что-то вроде:
SELECT  SUM (SELECT COUNT(*) FROM changes
GROUP BY  ip, mac, pcname HAVING COUNT(*)>1) FROM changes;