в веб-приложении, как действительно совершенствуют структуру базы данных?

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

Наивным подходом было бы генерировать все перестановки и затем проверять, какие из них соответствуют цели, но это были бы 8! = 40k перестановки. Это не очень много, но может быть проблемой для более длинных последовательностей или при этом довольно часто. Кроме того, вы можете получить все перестановки для единиц и нулей и распределить их в соответствии с вашим результатом; в вашем примере это будет просто 5!*3! = 720 (более сбалансированный == меньше / лучше).

Примерно так (примечание: я просто использовал строку вместо BitArray, но здесь это не имеет значения)

>>> bits = "11100011"
>>> trgt = "11101100"
>>> ones  = [i for i, e in enumerate(bits) if e == "1"]
>>> zeros = [i for i, e in enumerate(bits) if e == "0"]

>>> from itertools import permutations
>>> res = [[next(p1 if b == "1" else p2) for b in trgt] for p1, p2 in 
...        ((iter(p1), iter(p2)) for p1 in permutations(ones) 
...                              for p2 in permutations(zeros))]
...
>>> res[0]
[0, 1, 2, 3, 6, 7, 4, 5]
>>> len(res)
720
>>> set(''.join(bits[i] for i in l) for l in res)
{'11101100'}

Это дает вам решение для одного байта. Теперь, если я правильно понял, что многобайтовая часть, вы ищете одно транспонирование битов, которое можно применить к всем байтам. В этом случае число решений действительно быстро станет меньше. Вы можете использовать вышеупомянутый алгоритм, чтобы получить все решения для отдельных байтов, а затем получить set.intersection из них (сначала преобразуйте списки в кортежи, чтобы сделать их хешируемыми), или получить решения для первого байта (или лучше: наиболее «сбалансированный», имеющий наименьшее количество решений для начала), а затем проверьте, какие из них также решают другие.

6
задан Kara 23 January 2014 в 16:47
поделиться

8 ответов

Лично я использую очень похожий процесс для того, что Вы перечислили, я вижу Ваш аргумент об изменении, но ОЧЕНЬ редко делаю я вношу изменение, затем возвращаю его к старому пути на месте производства. В тестировании, да, который происходит, но с точки зрения фактического места производства, я не рассматриваю его как грандиозное предприятие.

Хранение отдельных сценариев версии, по моему скромному мнению, не только хорошо для развертывания, но также и хорошо для обеспечения объектов, которые могут быть проверены в управление исходным кодом.

5
ответ дан 9 December 2019 в 20:50
поделиться

Много платформ используют понятие "миграций" - сценарии, которые обновляют Вашу схему базы данных от одного пересмотра до следующего более высокого пересмотра. Аналогично, сценарий снижения обычно полезен, чтобы иметь также, в случае, если необходимо отступить изменение. Иногда эти сценарии находятся в SQL, иногда они абстрагированы (например, Ruby on Rails). Можно разработать эти сценарии вручную или использовать инструмент как SQL, Сравнивают это, другие упомянули.

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

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

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

2
ответ дан 9 December 2019 в 20:50
поделиться

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

сложный? несколько. жизненное сохранение. abosolutely. ничто как преследование erros в приложении, потому что схема является неправильной.

2
ответ дан 9 December 2019 в 20:50
поделиться

Необходимо, вероятно, считать aticle, который Atwood записал на управлении версиями DB при кодировании ужаса некоторое время назад: Ваша База данных При Управлении версиями?

1
ответ дан 9 December 2019 в 20:50
поделиться

Мы создаем каталог для каждого выпуска в нашем репозитории управления версиями. Мы записали сценарий, который читает сценарии в той папке и выполняет их в порядке имени файла (таким образом, мы пишем сценарии с именами такой как 32.0.0_AddColumnXxxxYyyy). Этот точечный формат позволяет нам вставлять сценарии в последовательность по мере необходимости.

Когда мы обновляем сайт, новые скрипты обнаруживаются и запускаются. Это имеет преимущество перед инструментом как SQL, Выдерживают сравнение (который я люблю нежно), потому что мы можем сделать модификации времени к данным. Однако мы действительно работаем, SQL Выдерживают сравнение, и Данные SQL Выдерживают сравнение (на выбранных таблицах) после обновления, чтобы гарантировать, что процедура работала правильно. После успешного выполнения фиксируется вся операция, и база данных обновляет "запущенные скрипты" информация, таким образом, эти скрипты не запущены снова.

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

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

1
ответ дан 9 December 2019 в 20:50
поделиться

Необходимо изучить инструмент под названием Powerdesigner. Можно загрузить 15-дневное полностью эксплуатационное испытание. Это поможет Вам модель, усовершенствует изменения и т.д.

Это - большой инструмент для того, чтобы сделать то, что Вы просите и многое другое.

1
ответ дан 9 December 2019 в 20:50
поделиться

Я делаю это почти таким же способом как Вы. Я сохраняю файл базы данных Release Notes, который имеет все изменения с моим новым, наверху перечисленным с числом пересмотра подверсии. Это также содержит SQL, который был выполнен для применения этого изменения.

Параллельно я поддерживаю модель базы данных (я использую Azzurri Clay в Eclipse) так, чтобы я мог повторно создать свою модель в любое время. Любые изменения, которые требуются, я сначала, делают в модели и затем обновляют мою Информацию о версии. Azzurri не может генерировать Изменения, хотя только СОЗДАЕТ.

Это все хранится под подверсией так, чтобы я мог откатывать при необходимости. Я, вероятно, должен сохранить своего рода ссылку между svn пересмотром моего приложения и пересмотром моей модели.

0
ответ дан 9 December 2019 в 20:50
поделиться

Используйте инструмент как SQLCompare RedGate или Объект xSQL из xSQL программного обеспечения для генерации разности/дельты сценарии T-SQL на лету.

Можно даже интегрировать его как часть процесса сборки, если Вам нравится.

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

Вот именно вкратце.

0
ответ дан 9 December 2019 в 20:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: