Управление денормализованными / дублированными данными в облачном хранилище

Вот решение. Взгляните на метод select (), который делает реальную вещь (метод main () неоднократно выполняет функцию select (), чтобы показать, что распределение действительно довольно равномерное).

Идея проста: когда вы читаете первую строчку, у нее есть 100% шанс быть выбранным в качестве результата. Когда вы читаете вторую строчку, у нее есть 50% шанс заменить первую строку в качестве результата. Когда вы читаете 3-ю строчку, у нее есть 33% шанс стать результатом. Четвертая строка имеет 25% и т. Д ....

import java.io.*;
import java.util.*;

public class B {

  public static void main(String[] args) throws FileNotFoundException {
     Map<String,Integer> map = new HashMap<String,Integer>();
     for(int i = 0; i < 1000; ++i)
     {
        String s = choose(new File("g:/temp/a.txt"));
        if(!map.containsKey(s))
           map.put(s, 0);
        map.put(s, map.get(s) + 1);
     }

     System.out.println(map);
  }

  public static String choose(File f) throws FileNotFoundException
  {
     String result = null;
     Random rand = new Random();
     int n = 0;
     for(Scanner sc = new Scanner(f); sc.hasNext(); )
     {
        ++n;
        String line = sc.nextLine();
        if(rand.nextInt(n) == 0)
           result = line;         
     }

     return result;      
  }
}
0
задан Socceroos 18 January 2019 в 13:31
поделиться

1 ответ

Я задаю этот вопрос из-за вашей просьбы от здесь .

Когда вы дублируете данные, нужно помнить одну вещь. Точно так же, как вы добавляете данные, вы должны поддерживать их. Другими словами, если вы хотите обновить / обнаружить объект, вы должны делать это в каждом месте, где он существует.

Какие шаблоны (если таковые имеются) обычно используются для отслеживания дублированных данных, чтобы их можно было корректно обновлять во избежание противоречивых данных?

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

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

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

Затем вы используете их для восстановления путей дублированных данных для поста (например, /users/[boardOwnerID]/boards/[boardID]/posts/[postID])?

Да, вам нужно перейти к каждому document() метод, соответствующий идентификатор документа, чтобы заставить операцию обновления работать. К сожалению, нет подстановочных знаков в путях Cloud Firestore к документам. Вы должны идентифицировать документы по их идентификаторам.

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

, если только правила безопасности Firestore не являются достаточно мощными, чтобы разрешить операции добавления для подколлекции / posts_denormalization_tracker / [postID] / location, не разрешая чтение или обновление подсборки или родительской коллекции postIDs.

Правила безопасности Firestore настолько мощны, чтобы сделать это. Вы также можете разрешить читать, писать или даже применять правила безопасности в отношении каждой необходимой вам операции CRUD.

Я в основном ищу разумный способ отследить сильно денормализованные данные.

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

Map<Object, DocumentRefence> map = new HashMap<>();
map.put(customObject1, reference1);
map.put(customObject2, reference2);
map.put(customObject3, reference3);
//And so on

Итерация по карте и добавление всех этих ключей и значений в пакет, фиксация пакета и все.

0
ответ дан Alex Mamo 18 January 2019 в 13:31
поделиться
Другие вопросы по тегам:

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