• Как правильно спроектировать связь БД между двумя товарами?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Вопрос: как мне правильно спроектировать таблицу для связей между этими товарами. Чтобы каждый из этих товаров ссылался друг на друга?

    CREATE TABLE groups_of_goods (
        group_id BIGINT UNSIGNED NOT NULL,
        product_id BIGINT UNSIGNED NOT NULL,
        PRIMARY KEY (group_id, product_id),
        FOREIGN KEY fk_product (product_id) REFERENCES product (product_id)
    );


    Соответственно если твои труселя входят в одну группу и ссылаются друг на друга, то в таблице будут 2 записи - (123, 10) и (123, 15).

    Кстати, такая схема обеспечивает и принцип "вассал моего вассала ...". Т.е. "пиджак малиновый" может ссылаться на "брюки малиновые" (через группу 456) и "пиджак в полоску" (через группу 789), но при этом последние два друг на друга ссылаться не будут, ибо разные группы.
    Ответ написан
    2 комментария
  • Сделать сетку из ромбиков, как?

    Чтобы рисовать отдельный ромбик, поможет мысленно дорисовать диагонали ромба: такой растянутый плюс. Центр плюса – центр ромбика.

    Пусть x и y это «радиусы» ромба. Есть координаты центра (cx, cy), или, удобнее, (0, 0) – понятны координаты вершин ромба: (-x, 0), (0, -y), (x, 0), (0, y) (по часовой стрелке).

    Соседний ромб справа: (0 + 2x, 0) (центр).
    Ромб вправо вниз: (0 + x, 0 + y).

    При рисовании на canvas удобно запоминать состояние, чтобы потом транслировать координаты, делая центром (0, 0) центр очередного ромбика. Рисовать ромбик, и затем восстанавливать состояние координат канвы из сохранённого.
    Ответ написан
    Комментировать
  • Зачем нужен StringBuilder? В каких случаях нужно использовать StringBuilder? Что мы выиграем используя StringBuilder?

    ayazer
    @ayazer
    Sr. Software Engineer
    смотрите лучше на пример когда у вас 1000 строк по 1мб.

    1000 строк по 1мб = 1Гб выделения памяти при загрузке, и еще (1+1000)/2 * 1000 ~ 500 Гб выделения памяти чтоб хранить промежуточные результаты (2мб сумма первых двух, 3мб сумма первых 3ех, 4мб сумма первых 4...)

    в случае со стрингбилдером у вас будет 1Гб выделения памяти памяти при загрузке + еще 1гб чтоб со всего этого собрать одну мега строку
    Ответ написан
    Комментировать
  • Как реализовать отношение один к одному в Entity Framework?

    BasiC2k
    @BasiC2k
    .NET developer (open to job offers)
    Почитайте - тут хорошо всё расписано.
    С точки зрения архитектуры БД, если есть отношение один-к-одному, то возможно есть смысл объединить данные в одну таблицу.
    Ответ написан
    Комментировать
  • Как лучше формировать уникальный номер в БД, помимо автоинкрементного ключа?

    usdglander
    @usdglander
    Yipee-ki-yay
    Вы же в курсе что уникальный индекс можно повесить на набор полей, а не на одно поле? Держите все эти поля в разных столбцах таблицы, а для контроля целостности объединяете их в один уникальный индекс.
    Ответ написан
    Комментировать
  • Как лучше формировать уникальный номер в БД, помимо автоинкрементного ключа?

    @Dmtm
    Android
    не надо смешивать техническую информацию с прикладной
    уникальный ключ - техническая, уникальный номер договора - прикладная,
    короче, естественные ключи - зло, абстрактные - добро,
    если заказчик непременно хочет что-то запихнуть в номер договора
    (причем гарантированно через год он захочет еще)
    то
    1) хранить это что-то как отдельные поля для поиска
    2) ни в коем случае не использовать номер договора для связей
    3) номер не хранить а собирать запросом только для вывода (если запретить редактирование исходных полей)
    4) уникальность номеру договора добавит timestamp
    Ответ написан
    Комментировать
  • Как хранить в базе исторические данные и удалять дубликаты?

    LaRN
    @LaRN
    Senior Developer
    Можно для каждого датчика в оперативной таблице хранить две даты: дата начала интервала постоянства и дата окончания этого интервала. Это такой интервал в котором значение датчика не меняется.
    Т. е. грузим текущие данные и если по датчику значение не поменялось, то просто изменяем дату окончания интервала на дату текущей загрузки, если значение датчика поменялось(отличается от сохраненного в оперативной таблице) , то текущий интервал выгружаем в архивную таблицу, а в оперативной добавляем новую(изменяем существующую) запись для датчика у которой дата начала и дата окончания будет равна дате текущей загрузки, а значение текущему загружаемому значению датчика.
    Т. е. в оперативной таблице всегда количество записей равно количеству датчиков, а в исторической весь скоп предыдущих значений.
    Это должно защитить от того, что с течением времени скорость работы с оперативной таблицей будет деградировать, от того что там будет расти число записей.
    Если же нужно какой-то отчёт строить или выгрузку за период или за прошлые даты, то тут уже нужно будет работать с исторической таблицей и это будет уже не очень быстро, но такие операции обычно не требуется часто выполнять.

    Так как данные грузятся раз в 3-4 дня, наверное не очень критично, что загрузка будет выполнять не мгновенно. Тут наверное проще в несколько этапов сделать: на первом проходе построить список идентификатор датчиков по которым значение не поменялось, затем по этому списку проапдейтить дату окончания интервала на дату текущей загрузки, затем по датчикам которые не попали в список перелить строки в архивную таблицу и наконец поменять для изменённый датчиков в оперативной таблице значение счётчика и даты начала и окончания интервала.
    Всё шаги можно делать массово.
    Ответ написан
    Комментировать
  • Как отсортировать массив в C#?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    var res = array.OrderByDescending(x=>x);
    Ответ написан
    Комментировать
  • Как создать и заполнить массив автоматически и добавить его в json?

    @OwDafuq
    Не указано, пишите вы на .Net Framework или .NET Core (.NET 5), но вот решение для .NET 5:
    1. Создаем класс Ret с свойством Words:
    class Ret
    {
    	public Ret()
    	{
    		Words = new List<string>();
    	}
    
    	public List<string> Words { get; set; }
    }

    2. Создаем класс, который содержит в себе класс Ret:
    class RequestData
    {
    	public RequestData()
    	{
    		Ret = new Ret();
    	}
    
    	[JsonPropertyName("ret")]
    	public Ret Ret { get; set; }
    }


    Создаем объект RequestData и заполняем его данными:
    RequestData rd = new RequestData();
    
    rd.Ret.Words.Add("Hello");
    rd.Ret.Words.Add("World!");


    Превращаем наш объект в JSON строку:
    var json = JsonSerializer.Serialize(rd);

    И выведем его в консоль:6054c53647f1b664254765.png
    Ответ написан
    Комментировать
  • Как создать объект из строки параметров?

    edward_freedom
    @edward_freedom
    Можно конечно. Количество значений должно идти подряд и соответствовать числу свойств в классе.
    var data = "0, 1.1, 1.2, 1.3, name, true";
                var myClass = MyClass.Parse(data);
                MyClass.SeeChanges(myClass);


    public class MyClass
        {
            private int Id { get; set; }
    
            private double X { get; set; }
    
            private double Y { get; set; }
    
            private double Z { get; set; }
    
            private string Name { get; set; }
    
            private bool Active { get; set; }
    
            public static MyClass Parse(string data)
            {
                var myClass = new MyClass();
                var properties = data.Split(',');
    
                var props = myClass.GetType().GetProperties(BindingFlags.NonPublic | BindingFlags.Public
           |                                                BindingFlags.Instance | BindingFlags.Static);
                for (int i = 0; i < props.Length; i++)
                {
                    var prop = props[i];
                    var type = prop.PropertyType;
                    prop.SetValue(myClass, Convert.ChangeType(properties[i], type, CultureInfo.InvariantCulture));
                }
                return myClass;
            }
    
            public static void SeeChanges(MyClass myClass)
            {
                var props = myClass.GetType().GetProperties(BindingFlags.NonPublic | BindingFlags.Public
          |                                                 BindingFlags.Instance | BindingFlags.Static);
                foreach (var prop in props)
                {
                    Debug.WriteLine("{0} = {1}", prop.Name, prop.GetValue(myClass, null));
                }
    
            }
        }
    Ответ написан
    1 комментарий
  • Есть ли мини-книжка/статья с совсеми запросами sql?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    "Весь список запросов по sql" - это примерно как "все предложения русского языка".
    SQL - это язык запросов, надо освоить его синтаксис и семантику, тогда сможете написать любой необходимый вам запрос.
    Ответ написан
    Комментировать
  • Как выполнять какие-то операции на сервере регулярно (с определённым интервалом)?

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    Кроме cron и cheduler.msc есть ещё Hosted Service и Quartz.NET
    Ответ написан
    Комментировать
  • Как можно использовать старый жесткий диск?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    В древние времена среди тру админов были соревнования по метанию винчестеров.
    Ответ написан
    Комментировать
  • Как читать эту строчку?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    CreateHostBuilder() - это метод, который объявлен ниже, он возвращает IHostBuilder
    Build() - это метод IHostBuilder, он возвращает собранный IHost
    Run() - это Метод-расширение на IHost

    Мой личный совет: сначала изучите основы языка, а потом уже приступайте к аспнету, иначе у вас на каждом шагу будут возникать тупые вопросы.
    Ещё обратите внимание на refactoring.guru
    Ответ написан
    Комментировать
  • Объясните разницу между технологиями?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    * asp - что то типа php, но с vb и js и вызовами COM
    * asp.net - то же самое но более навороченное, под капотом .net framework и событийная модель, типа как в windows
    * .net framework - платформа для кучи языков, основнаю плюшка в контроле памяти
    * .net core - развитие * .net framework, отвязанное от windows во многих смыслах
    * .net - тоже что и .net framework хотя впрочем в широком смысле все технологии
    * asp.net mvc - реализация патерна mvc в отличие от * asp.net менее затратен и более прям, но все приходится писать руками
    .net mvc, см * asp.net mvc
    .net core mvc см * asp.net mvc но на .net core
    Ответ написан
    Комментировать
  • Возможна ли публикации автономного ASP.NET Core приложения (сайта)?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Примерно неделю назад такое делал. Elf плюс конфиг. Ну и конечно настройка nginx. Если интересно чуть позже скину конфиги
    Ответ написан
    3 комментария
  • Какую книгу надо читать для изучения движка Unity в 2020 году?

    Забудь про Гошу Дударя!) Я тоже относительно недавно начал изучать все это...но уже знаю всех инфоциганов в этой сфере)
    Ответ написан
    Комментировать
  • Как использовать переменную типа char?

    FoggyFinder
    @FoggyFinder
    Давайте попробуем разобраться.

    Массив это ограниченный набор некоторых данных определенного типа.

    char[] notAllowedSymbols = { '!', '#', '$', '%', '&', '(', ')', '*', ',', '+', '-' };

    здесь, вы объявили массив элементов типа char.

    Для доступа к значению в массиве используются индексы.

    Первый элемент в массиве доступен по индексу 0.
    Второй - по индексу 1.
    и так далее.

    Можно легко заметить что индекс здесь это по сути просто порядковый номер сдвинутый на единицу.

    Теперь возвращаемся к нашему массиву notAllowedSymbols.

    Как теперь, учитывая информацию об индексах, получить доступ к какому-нибудь элементу? В C# для это есть индексаторы:

    массив[индекс]


    значит для получения первого элемента нужно написать

    var firstChar = notAllowedSymbols[0]; // '!'

    точно также можно получить любой другой элемент указав правильный индекс ([i]).

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

    Здесь лучше всего подойдут функции. Вынесем проверку отдельно. Ее результатом может быть или "пройдена успешна" или "содержит ошибки". Всего два значения. Значит, здесь удобно воспользоваться типом bool. True будет означать что пароль подходящий и False будет символизировать ошибку.

    Теперь сама реализация

    private static bool IsValid(string password)
    {
        char[] notAllowedSymbols = { '!', '#', '$', '%', '&', '(', ')', '*', ',', '+', '-' };
    
        for (int i = 0; i < notAllowedSymbols.Length; i++)
        {
            if (password.Contains(notAllowedSymbols[i]))
            {
                return false;
            }
        }
        return true;
    }
    Ответ написан
    Комментировать
  • Что сейчас используют чаще web api или mvc (asp.net core)?

    sarapinit
    @sarapinit
    Точу водой камень
    Просто апи в случае single page application, или веб сервиса без ui.
    MVC если хочется быстро сделать сайт с формами.

    Но граница очень размыта, знать одно и не знать другого, практически невозможно, и вопрос становится бессмысленным.
    Это разделение было сделано когда-то просто чтобы было 2 шаблона проекта в visualstudio, так что не советую на этом концентрироваться а изучать aspnetcore в целом
    Ответ написан
    Комментировать
  • Правильна ли реализация АПИ: new Car().Run(100)?

    Я бы переписал этот код так:
    public abstract class Transport {
        public int MaxSpeed { get; private set; }
    
        public Transport(int maxSpeed) {
            MaxSpeed = maxSpeed;
        }
    
        public string Run(int speed)
            => $"Скорость движения транспорта {(speed <= MaxSpeed ? "в пределах нормы" : "выше максимальной")}";
    }
    
    public class Car : Transport {
        public Car() : base(300) {}
    }
    
    public class Bike : Transport {
        public Bike() : base(40) {}
    }
    Ответ написан
    Комментировать