Представьте упорядочивание в реляционной базе данных

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

Для этого вам нужно будет использовать Сервис или Фабрику.

Службы - это ЛУЧШАЯ ПРАКТИКА для обмена данными между не вложенными контроллерами.

Очень очень хорошо аннотация по этой теме о совместном использовании данных - это объявление объектов. Мне не повезло, потому что я упал в ловушку AngularJS, прежде чем прочитал об этом, и я был очень расстроен. Так что позвольте мне помочь вам избежать этой проблемы.

Я прочитал из «ng-book: Полная книга по AngularJS», что AngularJS ng-модели, созданные в контроллерах как голые данные, являются WRONG!

Элемент области $ A должен быть создан следующим образом:

angular.module('myApp', [])
.controller('SomeCtrl', function($scope) {
  // best practice, always use a model
  $scope.someModel = {
    someValue: 'hello computer'
  });

И не так:

angular.module('myApp', [])
.controller('SomeCtrl', function($scope) {
  // anti-pattern, bare value
  $scope.someBareValue = 'hello computer';
  };
});

Это потому, что оно рекомендовано (ЛУЧШАЯ ПРАКТИКА) для DOM (html document), чтобы содержать вызовы как

<div ng-model="someModel.someValue"></div>  //NOTICE THE DOT.

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

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

Допустим, у вас есть ваш сервис «Factory», и в обратном пространстве есть объект A, который содержит объект B, который содержит objectC.

Если с вашего контроллера вы хотите ПОЛУЧИТЬ objectC в своей области, это ошибка, чтобы сказать:

$scope.neededObjectInController = Factory.objectA.objectB.objectC;

Это не работает ... Вместо этого используйте только одну точку.

$scope.neededObjectInController = Factory.ObjectA;

Тогда , в DOM вы можете вызывать objectC из объекта A. Это наилучшая практика, связанная с заводами, и, что самое важное, это поможет избежать неожиданных и неустранимых ошибок.

33
задан tghw 29 March 2009 в 14:48
поделиться

9 ответов

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

1
ответ дан 27 November 2019 в 19:33
поделиться

Просто мысль, рассматривая опция № 1 по сравнению с № 3 : разве расположенное с интервалами не выстраивает опцию (#3), только откладывают проблему нормального массива (#1)? Безотносительно алгоритма Вы выбираете, или он повреждается, и Вы столкнетесь с проблемами с № 3 позже, или он работает, и затем № 1 должен работать точно также.

3
ответ дан 27 November 2019 в 19:33
поделиться

Другая альтернатива была бы (если Ваш RDBMS поддерживает ее) использовать столбцы массива типа. В то время как это повреждает правила нормализации, это может быть полезно в таких ситуациях. Одна база данных, которую я знаю об этом, имеет массивы, PostgreSQL.

7
ответ дан 27 November 2019 в 19:33
поделиться

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

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

2
ответ дан 27 November 2019 в 19:33
поделиться

Используйте число с плавающей точкой для представления положения каждого объекта:

Объект 1-> 0.0

Объект 2-> 1.0

Объект 3-> 2.0

Объект 4-> 3.0

можно поместить любой объект между любыми другими двумя объектами простым делением пополам:

Объект 1-> 0.0

Объект 4-> 0.5

Объект 2-> 1.0

Объект 3-> 2.0

(Перемещенный объект 4 между объектами 1 и 2).

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

Объект 4-> 0.5

Объект 1-> 0.75

Объект 2-> 1.0

Объект 3-> 2.0

(Перемещают объект 1 в положение сразу после Объекта 4)

2
ответ дан 27 November 2019 в 19:33
поделиться

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

2
ответ дан 27 November 2019 в 19:33
поделиться

acts_as_list, смешивающийся в направляющих, обрабатывает это в основном способ, которым Вы обрисовали в общих чертах в № 1. Это ищет столбец INTEGER, названный положением (которых можно переопределить для именования, конечно), и использование, что, чтобы сделать ORDER BY. Когда Вы хотите переупорядочить вещи, Вы обновляете положения. Это служило мне очень хорошо каждый раз, когда я использовал его.

Как примечание стороны, можно устранить необходимость всегда сделать, менять местоположение на ВСТАВЛЯЕТ/УДАЛЯЕТ при помощи редкой нумерации - отчасти как основная спина в день... можно пронумеровать положения 10, 20, 30, и т.д. и если необходимо вставить что-то промежуточные 10, и 20 Вы просто вставляете его с положением 15. Аналогично, когда удаление Вас может просто удалить строку и оставить разрыв. Только необходимо сделать изменение нумерации при фактическом изменении порядка или при попытке сделать вставку и нет никакого соответствующего разрыва для вставки в.

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

4
ответ дан 27 November 2019 в 19:33
поделиться

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

1
ответ дан 27 November 2019 в 19:33
поделиться

У меня была эта проблема также. Я находился под тяжелой нехваткой времени (не все мы), и я пошел с опцией № 1 и только обновил строки, которые изменились.

при свопинге объекта 1 с объектом 10, просто сделайте два обновления для обновления номеров заказа объекта 1 и объекта 10. Я знаю, что это алгоритмически просто, и это - O (n) худший случай, но что худший случай - когда у Вас есть общая перестановка списка. Как часто это собирается произойти? Это - чтобы Вы ответили.

1
ответ дан 27 November 2019 в 19:33
поделиться
Другие вопросы по тегам:

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