Vikhrmodels/habr_qa_sbs huggingface dataset:
Вопрос: Как преобразовать двумерный массив в одномерный PHP?

Лучший ответ:
Точно такой массив какой вы хотите$arrOne = Array(
  0 => Array(
    0 => 'name 0',
    1 => 'name 1',
    2 => 'name 2'
  ),
  1 => Array(
    0 => 100,
    1 => 200,
    2 => 300
  )
);
$arrTwo = array();

foreach ($arrOne as $keys => $names) { 
	foreach ($names as $key => $name) {
		$arrTwo[$key][] = $name;
		continue;
	}
	

}

var_dump($arrTwo);

Худший ответ:
Можно получить несколько иной результат, но почти тот, что вам нужен:$arr = Array(
  0 => Array(
    0 => 'name 0',
    1 => 'name 1',
    2 => 'name 2'
  ),
  1 => Array(
    0 => 100,
    1 => 200,
    2 => 300
  )
);
$c = array_combine($arr[0], $arr[1]);
print_r($c);
Вопрос: Как пишутся консольные псевдографические приложения?

Лучший ответ:
Кроме уже сказанного - а еще есть различные ренкарнации TurboVision
в том числе и для Java
https://github.com/klamonte/jexer

Худший ответ:
вот  нашел, чтоlanterna
Вопрос: Как лучше хранить данные о трафике в БД?

Лучший ответ:
Подскажите, как лучше хранить все это дело в базе? Я думал хранить в одной величине, например, в байтах, но что-то слишком большие цифры получаются.Если эти числа не выходят за максимальный допустимый размер (диапазон), например 9223372036854775807 - знаковое, 18446744073709551615 - без знаковое BIGINT, то скорее всего, ничего лучше, для хранения чисел (чем специальный тип БД, предназначенный для хранения именно чисел) - Вы не найдете.
P.S. Если нужна точность до байт - хранить нужно в байтах. Если до мегабайт - соотв. округлять значения и хранить в мегабайтах. Т.е., в зависимости от необходимой точности можно выбрать конечную величину. Обработка больших цифр (целочисленных) - для компьютера не есть проблема, числа обрабатываются в ряде случаев, лучше чем например, текст.

Худший ответ:
Хотите экономно? "Сворачивайте" на ходу и раскладывайте готовый результат по группам (отчетам).
Вопрос: Зачем нужна Обратная Польская Запись?

Лучший ответ:
Что бы избавиться от скобок. Выражение в ОПЗ можно вычислять слева на право, читая посимвольно. При группировке скобками такое невозможно.UPD:
FPU, например, как раз программируется с помощью ОПЗ. Т.е. преобразовав выражение в ОПЗ можно очень легко записать его на ассемблере.

Худший ответ:
так удобнее автоматизировать вычисления
Вопрос: Как преобразовать многомерный массив строки JSON в многомерный массив JS?

Лучший ответ:
Удивительно )))var json_str = '[[{"key":"value","key":"value"}],[{"ID":"1","NAME":value","PARENT_NAME":"value","DIR_NAME":"value","IMAGE":value"},{"ID":"2","NAME":"value","PARENT_NAME":"value","DIR_NAME":"value","IMAGE":"value"}]]';
console.log(JSON.parse(json_str));

Худший ответ:
Спасибо
Вопрос: Почему в Убунту 500+ установленных пакетов, а в Дебиан всего 260?

Лучший ответ:
Потому что разные ОС.

Худший ответ:
Потому что соль солёная, а сахар сладкий. Разные дистрибутивы, разные варианты (desktop/server), разный набор пакетов.
Вопрос: Как лить трафик из фейсбук на «серый» сайт?

Лучший ответ:
Потому что тематика "заработок в интернете", оказывается, запрещена.
Мошенничество запрещено, а вы с Луны упали?Подскажите, как можно все-таки крутить рекламу такого сайта.
Никак. Кроме шуток.Может сервисы какие-то есть или на фейсбуке какие-то секретные способы.
Ха, обманщик не может смириться с мыслью, что кто-то не обманывает, кек.

Худший ответ:
Клоачьте, показывайте Фейсбуку другой сайт
Вопрос: Возможно ли в Laravel 5.4 с получить (вывести) название по ID из другого столбца?

Лучший ответ:
можно https://laravel.com/docs/5.4/eloquent-relationships конкретно в вашем примере это "один к одному"

Худший ответ:
Ответ оказался чуть сложнее:
В модели App\User необходимо указать дополнительные поля:public function country() {
  return $this->hasOne('App\Country', 'id', 'country_id');
}
а в App\Countrypublic function user() {
  return $this->belongsTo('App\User');
}
Ну и выводить $user->country()->name;
Вопрос: Как анимировать крутящий момент на JS?

Лучший ответ:
Учитывая что 3d и фото похожи так же, как банан на полироль. То думаю проще найти готовую анимацию гусениц.
Или как вариант - набросать в svg и анимировать через css.

Худший ответ:
Имхо только 3D рендер анимации. Могут сделать неотличимо от исходного фото, а не пластмассу как на втором примере. Недешево - моделировать цепи, их физику.
Вопрос: Выбор постов через hasMany по передаваемой метке в url?

Лучший ответ:
class Tags extends ActiveRecord
{
    public function getPages()
    {
         return $this->hasMany(Statjiblog::className(), ['id' => 'post_id'])->viaTable('{{%statjiblogtags}}', ['tag_id' => 'id']);
    }
}public function actionPage($slug){
  $model = Tags::find()->andWhere(['slug'=>$slug])->one();
  foreach($model->pages as $page){
      echo $page->title;
  }
}
Ну или с другой строны, через join;

Худший ответ:
Кому интересно как реализовать пагинацию относительно моего случая:
В контролере пишете так:$model = Tags::find()->andWhere(['slug'=> Yii::$app->getRequest()->getQueryParam('slug') ])->one();
        
        $query = $model->getPosti();
        $pagination = new Pagination([
            'defaultPageSize' => 1,
            'totalCount' => $query->count()
        ]);

        $query = $query->orderBy(['id' => SORT_DESC])
            ->offset($pagination->offset)
            ->limit($pagination->limit)
            ->all();

        return $this->render('tag', [
            'model' => $query,
            'pagination' => $pagination

            ]);
А views шаблоне где хотите вывести пишете так:<?=  LinkPager::widget([
        'pagination' => $pagination,
        'nextPageLabel' => '&raquo;',
        'hideOnSinglePage' => true,
        //'firstPageLabel' => 'В начало',
        //'lastPageLabel' => 'В конец',
        'prevPageLabel' => '&laquo;'

    ]) ?>
Вопрос: Прошу помощи в выборе оборудования и настройке домашней сети?

Лучший ответ:
Базовая настройка микротика из вебморды достаточно дружелюбна и мало отличается от настройки того же кинетика. А вот если уже в дебри лезть - там надо знать что делаешь.https://market.yandex.ru/product--wi-fi-tochka-dos...Для начала выкинуть репитер.  Кабель от провайдера в роутер, - от него провода в комнаты к точкам доступа и компьютерам.

Худший ответ:
Чем не устраивает Start на входе?
Поставить Giga III в щиток ведущим, от него кабелем в первую комнату Start (в режиме моста), во вторую комнату цепляйте свою Xiaomi также мостом по проводу от гиги, все стационарное желательно по проводу или от гиги или на худой конец от старта.
Да и зачем вам по маршрутизатору в каждой комнате? 
По опыту даже самые сложные планировки среднестатистических квартир прекрасно покрываются одной - двумя точками доступа, 3 это уже на хороший котедж.
Вопрос: Как побеждать на олимпиадах по математике и информатике?

Лучший ответ:
НикакЗнающий не говорит, говорящий не знает (Лао Цзы)
Просто участвуй в олимпиадах. Пытайся. Снова и снова. И наконец, тебе должно по настоящему нравится решать олимпиадные задачки, иначе все твои усилия будут бесполезны.
От себя скажу что решать олимпиады по программированию != Хорошо программировать
Говорю как человек в оных регулярно участвующий.
Олимпиады приучают ко всем антипаттернам, ограничения по времени не дают найти красивое и изящное решение, заставляют копипастить и писать "лишь бы работало".
Не веришь? Посмотри любые решения олимпиадников - на codeforces.com например.
Там по всем стандартам ад и ужас.
Лучше потратить время на что то действительно полезное, например на свой проект, разработка которого только в радость.

Худший ответ:
Иметь желание, решать задачки и побольше спать.
Вопрос: Как скрыть конфиги в js веб-приложении?

Лучший ответ:
фронтенд на то и фронтенд, что к любой его части у браузера есть доступ

Худший ответ:
Подключение к БД на фронте? Это что-то новенькое. 
Если вы имели в виду запросы к API, то они будут видны в любом случае — просто откройте вкладку network и читайте все заголовки, ключи, запросы и ответы. 
Если вы хотите, чтобы нельзя было обратиться к вашему API из других мест — настраивайте CORS, добавляйте JWT.
Вопрос: Как отлавливать «ольгинских» троллей?

Лучший ответ:
открытие нового комментария и submit 10-15 строчек
текста занимает считанные секунды (заготовленная копипаста).
Может, это и проверять?

Худший ответ:
На многих сайтах выводятся флаги стран IP комментирующих.
Также если фигачат копипасту, то почему бы не сделать защиту от копипасты?
Сделать защиту от постинга пока юзер свежий. Неужели ни разу форум не поднимали?
Вопрос: Как правильно писать Unit тесты для http запросов(Go)?

Лучший ответ:
По-моему Вам сюда https://github.com/jarcoal/httpmock

Худший ответ:
В таких случаях нужно разделить сложносоставную функцию на части. Что я имею в виду? Предположим, что ваша функция запрашивает данные из сети или читает с диска и потом их обрабатывает. В этом случае написать надёжный автотест не получится. Ведь сеть и диск - это всегда неопределённость. Поэтому следует разделить функцию на две - получение данных и обработка данных. В этом случае обработку данных легко тетировать передав в тест специально подготовленные данные. А функцию получения данных уже можно тестировать либо на эмуляторе источника (БД в памяти, тестовый сервер, специальные файлы и т.д.) либо вообще на заглушке. А может даже и на реальных источниках данных - всё зависит. При этом формально у вас будут и юнит-тесты и интеграционные тесты при использовании в тестах внешних компонент.
Вопрос: Как сделать код более плоским (промисы)?

Лучший ответ:
client.getAsync('data')
	.then((data) => {
		if (data)
			return [data.count, data.articles, true];

		return [Article.count({}),
			Article.find({}, '-_id title content slug')
				.sort({_id: -1})
				.limit(limit)
				.skip((page - 1) * limit),
			false]
	})
	.spread((count, articles, fromCache) => {
		if (!fromCache) {
			return new Promise((resolve, reject) => {
				client.set('data', JSON.stringify({count, articles}), "EX", 20, (error) => {
					if (error)
						return reject(error);

					return resolve([count, articles]);
				});
			});
		}

		return [count, articles];
	})
	.spread((count, articles) => {
		return res.status(200)
			.json({
				count,
				articles
			})
	})
	.catch((err) => {
		return next(err);
	});
Тоже не очень, нужно разделение кода, вынести в репозитории, которые будут управлять кешем и тогда код в контроллерах будет красивше, ну и саму запись в кеш изначально сделать на промисах, тогда можно будет придумать что-то еще. spread из bluebird

Худший ответ:
if (data) {
        return res.status(200).json(JSON.parse(data))
      } else {
...
}
Блок else можно опустить -- выигрыш в 1 уровень вложенности
Вопрос: Как деплоить сайт на хостинг правильно, быстро и удобно?

Лучший ответ:
> Но такой способ мне не очень удобный показался. Как делать хот-фиксы тогда? Изменение одной буквы в коде — целый процесс. 
В хорошем процессе это не проблема. Если изменение критичное вы просто деплоите старую версию (не откат, а именно деплой старой). Хот фиксы это уход от проблемы, а нее решение.
> В сети прочитал, что нужно использовать CI/CD, который будет скачивать последнюю версию из гита, устанавливать зависимости, тесты, перекачивать на сервер, разархивировать в отдельную папку, тесты, и в конце концов переключить симлинк вебрута на эту папку
У наиболее продвинутых ребят вся эта история уже делается (и довольно давно) используя docker. Вы можете хотя бы немного познакомиться с ним здесь guides.hexlet.io/docker/. Если докер для вас пока рано, то можно реализовать процесс используя Ansible и его специальный модуль docs.ansible.com/ansible/latest/deploy_helper_modu...
Там вы заодно увидите ответ на вопрос "что делать с состоянием". 
> Что делать с БД? Что делать с загруженными файлами от пользователей? Копировать из предыдущей версии?
Состояние никак не связано с деплоем, оно должно быть шареное. Если у вас есть файлы от пользователей, то возможно вы захотите использовать aws s3. Как минимум про него надо знать.
Рекомендую заодно посмотреть вебинар про stateless vs statefull чтобы немного понимать эту тему: https://www.youtube.com/watch?v=WPCz_U7D8PI

Худший ответ:
В сети прочитал, что нужно 
ну, Сеть нужно уметь читать..
может, это?
https://habrahabr.ru/company/infopulse/blog/330708/
Вопрос: Где прописывать свои функции при работе с Windows Forms?

Лучший ответ:
Пишите в Form1.cs

Худший ответ:
Тоже хотелось бы понимать как правильно структурировать код приложения, на текущий момент я тоже прописываю весь свой код в класс формы, но хотелось бы понимать куда его правильно прописывать при создании приложений в WinForms. Т.к приложение уже становится совсем большим, ориентироваться в классе формы становится все сложнее и сложнее.  Увидеть бы на примере структуру достаточно большого приложения в виде скрина обозревателя решений типа этого, но правильное 
Автору вопроса такой скрин тоже думаю дал бы понятный ответ.
Вопрос: Как править чужой код так чтоб его не сломать?

Лучший ответ:
Во первых нужно закладывать время на разбор легаси кода, об этом сразу надо говорить с заказчиком. Зная задачу, всегда понимаешь, ЧТО надо написать, но в случае с легаси надо еще и понять КУДА это написать. Без этого никак и поэтому это время надо учитывать.
Второе. Когда-то меня учили, что код нужно менять только дописывая его, в крайнем случае удаляя, но ни в коем случае не переписывая. Поэтому, если надо изменить поведение - наследуешься, переопределяешь метод и используешь новый класс. Мне сложно судить о php, как этот проект реализован, но ООП для того и придумали, что его легче поддерживать и он легче модифицируется.
Следующий вариант изучить код, начинать писать тесты к нему. Я этим способом пользуюсь редко, в основном пишу на то, в чем я не уверен, что боюсь сломать.
Ну конечно система контроля версий, по чаще комиты, чаще запускай проект, смотри, что ничего не сломалось. Я перестал бояться что-то сломать, потому что в любой момент могу сравнить, что изменилось в коде, между ветками и если сломалось, то сделать реверт или уйти на рабочую ветку.
А вообще чтение легаси, это дело опыта. Я помню первые свои чужие проекты, я думал, что попал в ад. Сейчас копаться в чужом коде, это мое любимое дело) Я могу часами сидеть разбирать чужой код, что начальству приходится меня попускать: "я понимаю, я тоже это люблю, но надо дело делать")) Люблю просто на гитхабе полазить по чужим проектам, посмотреть как люди думают.

Худший ответ:
Желательно чтобы ошибки можно было делать и быстро исправлять:
- Иметь возможность откатывать релиз с продакшена на преведущую версию - замечальная возможность на крайний случай, если все вообще плохо пошло.
- Использовать инструмент для версионирования кода - git например.
- Писать тесты для кода который вы редактируете, поможет не только обезопасить себя от глуппых ошибок, но и лучше изучить как код работает.
Никаких специфик по wordpress к сожалению дать не могу.
Вопрос: Проблемы с сайтом после переноса в digital ocean?

Лучший ответ:
Use of undefined constant php - assumed 'php'
возникает когда ты делаешь так $arr[php] , вместо $arr['php']
Undefined index: depend_fields
возникает когда ты делаешь так $arr['depend_fields'] , но в массиве нет такого индекса, надо
$val = isset($arr['depend_fields']) ? $arr['depend_fields'] : 'значение-по-умолчанию';
или для php7: $val = $arr['depend_fields'] ?? 'значение-по-умолчанию'
Trying to get property of non-object
возникает когда ты делаешь так $obj->depend_fields , но в объекте нет такого свойства или это не объект, надо так:
if (is_object($obj) && property_exists($obj, 'depend_fields')) {
 var_dump($obj->depend_fields);
}
Ищи места где проявляются ошибки и исправляй

Худший ответ:
В конфиге php. Раньше у вас просто уровень вывода ошибок был не таким строгим, и попытки получить доступ к несуществующим элементам массива не отображались.
Вопрос: Чем отличаеться promise от обычных коллбэков?

Лучший ответ:
Не то же самоеfunction ajax() {
  return fetch(target, fetchOptions)
    .then((response) => {
      if (!target) throw new Error('Invalid url');
      if (response.ok) return response.json();
      throw new Error(`${response.status} ${response.statusText}`);
    })
    .then((json) => {
        if (json['statusOk']) return json;
        throw new Error(json['message'] || 'Server response was not ok');
    });
}

ajax(action, { body: formData })
  .then((json) => {
    console.log('RESPONSE', json);
  })
  .catch((error) => {
    console.error(error);
  });
Мы можем писать сколько угодно зенов, в каждом что-то делать с данными.
Если в любом месте вылетит ошибка, она будет нормально обработана в кэтче. 
Код при этом линейный, без дикой вложенности.
С коллбэками вам нужно на каждом этапе отслеживать ошибки и возвращать их. Легко потеряться, что откуда всплыло или где пропало.
Альтернатива обработки ошибок — трай/кэтч. Но это не работает на асинхронном коде.function myFunc(cb){
  var err = true;
  // имитируем асинхронную операцию
  setTimeout(function(){
    cb(err);
  }, 10);
}

try {
  myFunc(function(err){
    if (err) throw new Error('Oops');
  });
  alert('Всё как бы хорошо!');
} catch(e) {
  alert(e.message);
}
Этот код выведет сообщение 'Всё как бы хорошо!', хотя всё плохо, была ошибка. https://jsfiddle.net/r3zfa4ee/
С промисами иначе:function myFunc(){
  let promise = new Promise((resolve, reject) => {
    let err = true;
  
    // имитируем асинхронную операцию
    setTimeout(() => {
      if (err) {
        reject('Ooops!');
      } else {
        resolve(123);
      }
    }, 10);
  });
  
  return promise;
}

myFunc()
  .then(data => {
    alert('Всё точно хорошо!');
  })
  .catch(e => {
    alert(e);
  });
Здесь уже ошибка будет обработана как надо и мы увидим сообщение 'Ooops!' https://jsfiddle.net/43yh8jad/
Мы можем выполнить промисы последовательно. Мы можем выполнить их параллельно. Мы можем запустить их на параллельное выполнение, но дождаться только первого отработавшего (так называемая promise race). Разумеется всё это можно и без промисов написать, но какая будет разница в объеме кода и в сложности его понимания?
А еще есть async/await...

Худший ответ:
Кучей всяких методов bluebirdjs.com/docs/api-reference.html
И ненужностью передавать ошибки первым аргументом
Вопрос: Как не скачивать каждый раз плагины gulp?

Лучший ответ:
Сделал две кнопки на тулбаре коммандера
Первая клонирует репу со сконфигурированным гальпом:

Вторая создает симлинк на папку с модулями в текущем проекте
runas /env /user:Администратор "D:\OpenServer\domains\frontend\runas_mklink_gulp-starter.bat"
Содержимое батника
@echo off
mklink /D node_modules e:\YandexDisk\domains\frontend\gulp-starter\node_modules
В папке e:\YandexDisk\domains\frontend\gulp-starter\node_modules предустановленные модули для вышеозначенной репы

Жму одну кнопку, жму вторую, и типовой проект для верстки развернут. Запускаем галп и работаем. Полминуты на всё.

Вот так это выглядит:


Худший ответ:
гуглить вот так
Вопрос: Как исправить PHP Parse error: syntax error, unexpected '{'?

Лучший ответ:
Нет. Просто плохой минификатор. 
С другой стороны минификация исходников PHP - это откровенная бессмысленная бредятина, которая не добавляет ни скорости, ни уменьшает потребление памяти, лишь добавляет проблем.

Худший ответ:
Вам не кажется, что просто кто-то съел тот закрывающий символ фигурной скобки? Ибо по ошибке понятно, что имеется лишняя открывающаяся скобка.
Вопрос: Оправдано ли использование Redis для подобного?

Лучший ответ:
Вы, по-сути, реализовываете хранение сессионных данных пользователя. Использовать для этого redis вполне обычная и распространённая практика.
P.S.: выигрывать что-то в быстродействии лучше стараться только после того, как оно было проиграно на практике, так называемая "преждевременная оптимизация" (решение несуществующих проблем) - очень распространённый психоз среди начинающих разработчиков.

Худший ответ:
Если список вопросов/ответов небольшой, скажем < 4кб, то я бы его целиком читал/писал в монгу. Если список действительно большой то использовать redis оправдано с целью уменьшения запросов к ДБ. Только лучше сначала писать в ДБ затем в redis, иначе( если база отвалится) можете задать пользователю следующий вопрос без сохранения предыдущего.
Вопрос: Почему интегрированные raid постоянно пересобирается?

Лучший ответ:
Упс...raid5...полусофтовый рейд...стор для виртуалок...Hyper-V или KVM? VMWare такого сотворить просто не даст :)
Вы, уважаемый, сделали все, чтобы у Вас сервер работал как можно хуже и как можно неустойчивей. Удавите жабу, купите бу адаптек. 6 - 7 тыс руб и все Ваши проблемы решены.
И имейте в виду, что к RAID5 обязательно нужен хотспарник - чтобы в случае отказа диска система тут же хватала хотспарник и начинала восстановление. Потому что восстановление массива может идти несколько суток, и отказ в это время еще одного диска - это все, се[p]верная пушная лисица массиву...

Худший ответ:
Интегрированный Raid - не Raid. Или аппаратный с BBU, или вообще без Raid. Raid 5 на сервере - совсем не лучший выбор, лучше Raid 1 или 10.
Вопрос: Как экспортировать большие данные в excel?

Лучший ответ:
Есть специальный пакет для экспорта большого объема, можете попробовать его.
https://github.com/box/spoutSpout is a PHP library to read and write spreadsheet files (CSV, XLSX and ODS), in a fast and scalable way. Contrary to other file readers or writers, it is capable of processing very large files while keeping the memory usage really low (less than 3MB).

Худший ответ:
Или использовать библиотеку PHPExcel, для генерации excel файла
Вопрос: Можно ли заменить видео-карту на thinkpad e330?

Лучший ответ:
Если не таскаете ноут, то можно попробовать купить с али переходник mini pci-e to pci-e и  подцепить внешнюю видеокарту.

Худший ответ:
Ваша модель не предполагает замену видеокарты.
Даже если в вашей конфигурации есть дискретная карта, то она распаяна на материнской плате.
Единственное что можно попытаться сделать - заменить процессор, если вообще сможете найти замену. Судя по мануалу (стр 75) он не распаянный, а устанавливается в сокет. Если повезет, то сможете найти поддерживаемую модель с лучшим интегрированным чипом.
Но мое мнение - оно того не стоит.
Вопрос: Как отвязать друг от друга radio buttons?

Лучший ответ:
Дать разный name=""

Худший ответ:
https://jsfiddle.net/joomla/03aoLhky/2/
Правильно используй label
+ у тебя два незакрытых div висит. Редактором тоже научись пользоваться. Подсветка для этого и нужна
В твою кучу и вкинул, что бы сам и поправил код ;)
Вопрос: Насколько внешние ключи любят ресурсы?

Лучший ответ:
Делать внешние ключи обязательно.
И уникальные индексы проставлять. Ещё бы check constraint ставить, да у вас глупый mysql в тегах, он такое не умеет.
Это всё ваши помощники. Они помогают искать ошибки и отлично мешают делать глупости.
И выбирать подходящие типы данных. Ну и раз у вас mysql - то всенепременно проверить sql_mode и выставить его максимально агрессивным. В 5.7 стало гораздо лучше, до этого из коробки уж слишком много позволял делать глупостей.
Дорастёте до террабайтной базы как авито - тогда можете начинать думать, а сколько денег нам стоит целостность внешних ключей или дешевле будет периодически проверять целостность скриптами и озадачивать разработчиков. О, кстати, вот запись доклада с pgday15, на 27 минуте как раз начинается обсуждение вопроса из зала "ребята, а вы в своём уме отключать FK?"

Худший ответ:
Решил начать их использовать по полной
Помните поговорку про того, кто лоб расшибёт?
Использовать нужно не "по полной", а "по необходимости".
Любой индекс замедляет вставку (не так уж сильно, но на млн. записей - ощутимо), и тратит не столько диск (это фигня), сколько память (что тоже недорого, но просто её нужно будет докупить).
Зато индексы нередко в 10-ки/100-ни раз ускоряют выборку.
Соответственно, если у вас есть регулярная выборка типа "все заказы пользователя", то по "пользователю" лучше (надо) индекс создать.
Заметьте,  я описать только индексы, но FK - это не только индексы, это и контроль целостности, что тоже ресурсы (польза тоже бывает, но совсем не всегда и в простых приложениях типа инет-магазина скорее бессмысленна).