Обрисую ситуацию
у меня есть файл в нем около семи тысяч строк по нему надо произвести поиск (по каждой строке файла, а не по всему файлу).
Так вот в чем вопрос, что лучше использовать файл 7000 тыс строк или разбить его на 7 файлов по тысяче и искать уже в них?? Что лучше в вопросах оптимизации чтения??
Спустя 2 часа, 39 минут, 3 секунды (10.06.2010 - 22:24) Gabriel написал(а):
Цитата |
у меня есть файл в нем около семи тысяч строк по нему надо произвести поиск (по каждой строке файла, а не по всему файлу). |
это как так? если в файле 7к строк и нужно прочитать все 7к то это уже весь файл.
а можно читать по 700 строк не разбивая файл.
Спустя 1 час, 59 минут, 49 секунд (11.06.2010 - 00:24) KaFe написал(а):
да файл должен весь быть прочитан!!!!
вот открыли мы файл с помощью $file=file('путь до файла'), все же строки записались в массив, и если у меня было 7000 строк то в массиве стало 7000 элементов, по ним я ищу определенную строку.
Будет ли выгоднее разбить файл???
вот открыли мы файл с помощью $file=file('путь до файла'), все же строки записались в массив, и если у меня было 7000 строк то в массиве стало 7000 элементов, по ним я ищу определенную строку.
Будет ли выгоднее разбить файл???
Спустя 3 минуты, 44 секунды (11.06.2010 - 00:28) twin написал(а):
Прочтать весь файл и считать весь файл - не одно и то же.
Разбивать его не нужно, правильно Gabriel сказал. Нужно читать частями, что бы не забивать оперативку.
Разбивать его не нужно, правильно Gabriel сказал. Нужно читать частями, что бы не забивать оперативку.
Спустя 22 минуты (11.06.2010 - 00:50) KaFe написал(а):
Как его читать частями??
Спустя 16 минут, 30 секунд (11.06.2010 - 01:07) Nikitian написал(а):
Пример из мануала
Тут есть чтение построчно. Меняете логику на свою и всё готово. Главное не забывайте ставить бряк, если всё, что нужно, найдено и дальше можно не читать.
Тут есть чтение построчно. Меняете логику на свою и всё готово. Главное не забывайте ставить бряк, если всё, что нужно, найдено и дальше можно не читать.
Свернутый текст
<?php
$f = fopen ("fgetstest.php", "r");
$ln= 0;
while ($line= fgets ($f)) {
++$ln;
printf ("%2d: ", $ln);
if ($line===FALSE) print ("FALSE\n");
else print ($line);
}
fclose ($f);
?>
Спустя 4 минуты, 56 секунд (11.06.2010 - 01:11) Gabriel написал(а):
Nikitian
а функцией file() не проще? она если не ошибаюсь возврящает массив с содержимым файла построчно.
а функцией file() не проще? она если не ошибаюсь возврящает массив с содержимым файла построчно.
Спустя 4 минуты, 29 секунд (11.06.2010 - 01:16) KaFe написал(а):
Вообще есть такая функция которая бы прочитала например от 100 до 600 строки в файле, и не затрагивала бы другие строки???Если есть то покажите пример))))
Спустя 8 минут (11.06.2010 - 01:24) Gabriel написал(а):
только руками писать там строчек 6-8 будет приблизительно. все что нужно создать переменную для определения стартовой строчки запихнуть функцию file() в цыкл и записать в переменную все нужны линии. а когда дошел до последней брякнуть.
Спустя 9 минут, 2 секунды (11.06.2010 - 01:33) sl4mmer написал(а):
KaFe
ну чисто логически - читать частями будет выгоднее в плане экономии ресурсов ... но чуть дольше в плане выполнения скрипта - а вообще если интересует оптимизация кода , советую ознакомиться с этой статьей .. материал стар, но до сих пор актуален)
ну чисто логически - читать частями будет выгоднее в плане экономии ресурсов ... но чуть дольше в плане выполнения скрипта - а вообще если интересует оптимизация кода , советую ознакомиться с этой статьей .. материал стар, но до сих пор актуален)
Спустя 5 минут, 9 секунд (11.06.2010 - 01:38) sl4mmer написал(а):
вот кстати слегка твой адрес - цитата из этой статьи
Цитата |
Для чтения файла file() быстрее, чем fopen+цикл - ускорение 40% Чтобы прочитать в массив $x файл размером 1Мб (100 000 строк по 10 байт) можно воспользоваться двумя вариантами: чтение файла с помощью file(), либо традиционным методом fopen/fgets. Разумеется, для файлов разного объема и содержимого скорость может меняться. Но в данном примере статистика такова: file("1Mb_file.txt") работает на 40% быстрее, чем: $f=fopen("1Mb_file.txt","r") or die(1); while($x[]=fgets($f,1000)); fclose($f); Аналогичные варианты $f=fopen("1Mb_file.txt","r") or die(1); while($s=fgets($f,1000)) $x[]=$s; fclose($f); или $f=fopen("1Mb_file.txt","r") or die(1); while(!feof($f))) $x[]=fgets($f,1000); fclose($f); работают еще медленнее (во втором случае лишняя функция feof() заметно снижает скорость). Тот же тест, но на 15Мб файле (100 000 строк по 150 байт) показывает разницу в 50%, в пользу file(). Тест проводился так, чтобы исключить фоновый своппинг во время работы из-за предшествующих команд создания/чтения таких больших файлов. Подсчитать тоже самое на очень маленьких файлах в 1-2 Кб не представляется возможным, т.к. операцию чтения нельзя повторять в течении одного теста, операции чтения будут кешироваться... |
Спустя 9 минут, 15 секунд (11.06.2010 - 01:47) KaFe написал(а):
sl4mmer статья очень интересная спясябки
Gabriel я знаю такой способ.
дополнение к вопросу:
Если я разбил файл из 7к на 7 файлов по 1000 и начал по очереди искать в каждом файле, это увеличит скорость выполнения скрипта или она останется таковой же?
Gabriel я знаю такой способ.
дополнение к вопросу:
Если я разбил файл из 7к на 7 файлов по 1000 и начал по очереди искать в каждом файле, это увеличит скорость выполнения скрипта или она останется таковой же?
Спустя 8 часов, 29 минут, 38 секунд (11.06.2010 - 10:17) twin написал(а):
Gabriel
Цитата |
а функцией file() не проще? она если не ошибаюсь возврящает массив с содержимым файла построчно. |
А если файл 100 мегабайт?
Тест из статьи не совсем корректен.
Вообще нужно смотреть на размер файла, как я уже говорил. Если файл большой, и посещаемость большая, то торможение при использовании file может происходить по причине ограничения на ресурсы. С файлом в 1-2 mb можно так поэкономить, а вот более серьёзные вещи - отнюдь.
Тест из статьи не совсем корректен.
Вообще нужно смотреть на размер файла, как я уже говорил. Если файл большой, и посещаемость большая, то торможение при использовании file может происходить по причине ограничения на ресурсы. С файлом в 1-2 mb можно так поэкономить, а вот более серьёзные вещи - отнюдь.
Цитата |
Если я разбил файл из 7к на 7 файлов по 1000 и начал по очереди искать в каждом файле, это увеличит скорость выполнения скрипта или она останется таковой же? |
Мало того, что увеличит, это еще и лишних 6 обращений к файловой системе. Ну если конечно не прервать процесс при первом найденом результате. И то, если этот результат будет найден в самом начале.
Спустя 1 час, 31 минута, 53 секунды (11.06.2010 - 11:49) Nikitian написал(а):
Цитата (twin @ 11.06.2010 - 07:17) |
торможение при использовании file может происходить по причине ограничения на ресурсы. |
Не будет торможения. Будет "Unable to allocate xxx bytes"
Спустя 10 минут, 6 секунд (11.06.2010 - 11:59) KaFe написал(а):
Цитата |
Вообще нужно смотреть на размер файла, как я уже говорил. Если файл большой, и посещаемость большая, то торможение при использовании file может происходить по причине ограничения на ресурсы. С файлом в 1-2 mb можно так поэкономить, а вот более серьёзные вещи - отнюдь. |
и что вы предлагаете ??? Как выйти из ситуации?
Спустя 1 час, 5 минут, 55 секунд (11.06.2010 - 13:05) Gabriel написал(а):
twin
Цитата |
А если файл 100 мегабайт? |
а вот об этом я как-то не подумал.
Спустя 6 минут, 5 секунд (11.06.2010 - 13:11) twin написал(а):
Цитата |
и что вы предлагаете ??? Как выйти из ситуации? |
Все же написали вроде... Если файл не слишком большой, то file(), если большой, то читать частями. Файл сформирован или свой?
Спустя 9 часов, 52 минуты, 56 секунд (11.06.2010 - 23:04) KaFe написал(а):
twin файл свой, в нем каждая строчка имеет строго определенный формат, записи в файл добавляются по одной строчке, вопрос КАК ЧИТАТЬ ЧАСТЯМИ????
Спустя 5 минут, 3 секунды (11.06.2010 - 23:09) twin написал(а):
Большие файлы
Ни для кого не секрет, что есть достаточно приличный арсенал штатных функций для работы с файлами. Но не всегда они удовлетворяют текущим потребностям. В основном это касается чтения очень больших файлов. Дело в том, что получить данные из середины файла можно только считав его весь в оперативную память. И хотя есть функция fgets(), позволяющая читать его частями, определить место нужного участка весьма проблематично. А читать весь файл в оперативную память очень расточительно. Тем более, если файл очень большой. Он может просто напросто туда не поместиться. Особенно учитывая ограничения ресурсов на хостингах.
Для справки, начиная с версии PHP 5.1, функция file_get_contents() тоже умеет читать файл частями. Но и это нам не поможет, так как определить место, откуда начинать чтение, крайне затруднительно.
Попытаемся выйти из положения. Собственно ничего особо нового мы изобретать не станем. Все давно придумано и реализовано в базах данных. Попробуем просто разобраться. как это устроено, и соорудить что-то по образу и подобию.
Для того, что бы получить часть файла, мы будем записывать в него информацию построчно. Каждая строка - это набор символов, оканчивающийся символом перевода на новую строку (LF) (\n). В десятичном виде он представляется как число 10, в шестнадцатеричном как 0x0A .
Для чего так. При такой схеме нам будет достаточно узнать количество байт до начала нужной строки, и мы сможем дальше спокойно отсчитать нужное их количество. А вот для того, что бы определить начало строки, есть два пути.
Первый - сделать их одинакового размера. Тогда можно будет просто умножить заданный размер на количество строк, и мы получим искомую величину. Сделать это можно ограничив размер заданной величиной, а если данных меньше, дополнить до заданной какими то заполнителями. Например пробелами. А при чтении удалить их.
Второй - записать длину каждой строки допустим в сериализованный массив, а его поместить служебной строкой в файл. Можно даже в отдельный файл, который будет на порядки меньше основного, и считывать оттуда. Это называется индекс.
У обоих путей есть как преимущества, так и недостатки. Мы реализуем оба и дадим возможность выбрать. Фактически сейчас мы построим микро базу данных. Из недостатков первого пути - файл получается больше, чем мог бы быть из за лишних наполнителей. И к тому же ограничение размера строки - тоже не лучшее решение. У второго пути несколько ниже быстродействие, особенно если файла два. И работать эти файлы могут только вместе, если индекс утерян или поврежден - прочитать основной файл уже проблематично.
Итак, поехали.
Ни для кого не секрет, что есть достаточно приличный арсенал штатных функций для работы с файлами. Но не всегда они удовлетворяют текущим потребностям. В основном это касается чтения очень больших файлов. Дело в том, что получить данные из середины файла можно только считав его весь в оперативную память. И хотя есть функция fgets(), позволяющая читать его частями, определить место нужного участка весьма проблематично. А читать весь файл в оперативную память очень расточительно. Тем более, если файл очень большой. Он может просто напросто туда не поместиться. Особенно учитывая ограничения ресурсов на хостингах.
Для справки, начиная с версии PHP 5.1, функция file_get_contents() тоже умеет читать файл частями. Но и это нам не поможет, так как определить место, откуда начинать чтение, крайне затруднительно.
Попытаемся выйти из положения. Собственно ничего особо нового мы изобретать не станем. Все давно придумано и реализовано в базах данных. Попробуем просто разобраться. как это устроено, и соорудить что-то по образу и подобию.
Для того, что бы получить часть файла, мы будем записывать в него информацию построчно. Каждая строка - это набор символов, оканчивающийся символом перевода на новую строку (LF) (\n). В десятичном виде он представляется как число 10, в шестнадцатеричном как 0x0A .
Для чего так. При такой схеме нам будет достаточно узнать количество байт до начала нужной строки, и мы сможем дальше спокойно отсчитать нужное их количество. А вот для того, что бы определить начало строки, есть два пути.
Первый - сделать их одинакового размера. Тогда можно будет просто умножить заданный размер на количество строк, и мы получим искомую величину. Сделать это можно ограничив размер заданной величиной, а если данных меньше, дополнить до заданной какими то заполнителями. Например пробелами. А при чтении удалить их.
Второй - записать длину каждой строки допустим в сериализованный массив, а его поместить служебной строкой в файл. Можно даже в отдельный файл, который будет на порядки меньше основного, и считывать оттуда. Это называется индекс.
У обоих путей есть как преимущества, так и недостатки. Мы реализуем оба и дадим возможность выбрать. Фактически сейчас мы построим микро базу данных. Из недостатков первого пути - файл получается больше, чем мог бы быть из за лишних наполнителей. И к тому же ограничение размера строки - тоже не лучшее решение. У второго пути несколько ниже быстродействие, особенно если файла два. И работать эти файлы могут только вместе, если индекс утерян или поврежден - прочитать основной файл уже проблематично.
Итак, поехали.
Спустя 45 секунд (11.06.2010 - 23:10) twin написал(а):
Фиксированная длина строк
Чтобы было легко ориентироваться в файле, нужно все строки сделать одной длины. Лишнее отрезать, недостающее заполнить пробелами.
Вот такая функция поможет это сделать:
Теперь сколько бы байт не содержала исходная строка, на выходе всегда будет столько, сколько мы зададим вторым параметром. Нужно учитывать этот момент, иначе можно потерять данные, если строка окажется длиннее.
Еще одна тонкость. Функция strlen() считает именно байты, а не символы. И это тоже нужно учитывать при работе с многобайтными кодировками.
Для того, что бы продолжить не с пустыми руками, а проверяя все на практике, нам потребуется очень большой файл. Вот такой скрипт слепит нам нужный файл:
Он будет работать долго, несколько минут (может даже десяток-другой). В результате получится файл размером около 1 гигабайта. Такой файл ни за какие коврижки нельзя открыть функцией file() к примеру. Ну а мы себе поставили цель научиться читать таких монстров, так что продолжим. Объект для поползновений теперь есть.
Вот так читается одна строка из этого файла:
Очень легко и быстро. Функция принимает аргументами путь до файла, номер строки, с которой начинать чтение, и опционально (не обязательный параметр) заданную ранее длину строки.
А можно прочитать заданное количество строк, добавив еще один параметр (количество). За одно уберем пробелы - заполнители и представим результат в виде массива, как это сделала бы функция file()
Вот примерно по такому принципу организовано храенение данных в базе MySQL тип поля char. Не зря мы так назвали функцию.
Чтобы было легко ориентироваться в файле, нужно все строки сделать одной длины. Лишнее отрезать, недостающее заполнить пробелами.
Вот такая функция поможет это сделать:
function levelString($string, $size = 100)
{
// Вычисляем размер строки в байтах
$lenght = strlen($string);
// Если больше заданной - обрезаем
if($lenght > $size)
$string = substr($string, 0, $lenght);
elseif($lenght < $size)// Если меньше - заполняем
$string = str_pad($string, $size);
return $string;
}
Теперь сколько бы байт не содержала исходная строка, на выходе всегда будет столько, сколько мы зададим вторым параметром. Нужно учитывать этот момент, иначе можно потерять данные, если строка окажется длиннее.
Еще одна тонкость. Функция strlen() считает именно байты, а не символы. И это тоже нужно учитывать при работе с многобайтными кодировками.
Для того, что бы продолжить не с пустыми руками, а проверяя все на практике, нам потребуется очень большой файл. Вот такой скрипт слепит нам нужный файл:
<?php
set_time_limit(0);
function levelString($string, $size = 100)
{
$lenght = strlen($string);
if($lenght > $size)
$string = substr($string, 0, $lenght);
elseif($lenght < $size)
$string = str_pad($string, $size);
return $string;
}
for($i = 0; $i < 10000000; $i++)
file_put_contents('1.txt', levelString('строка '. $i) ."\n", FILE_APPEND);
Он будет работать долго, несколько минут (может даже десяток-другой). В результате получится файл размером около 1 гигабайта. Такой файл ни за какие коврижки нельзя открыть функцией file() к примеру. Ну а мы себе поставили цель научиться читать таких монстров, так что продолжим. Объект для поползновений теперь есть.
Вот так читается одна строка из этого файла:
<?php
function charRead($file, $start, $size = 100)
{
// Вычисляем стартовую позицию,
// добавляя к каждой строке один байт на символ переноса
$offset = $start * $size + $start;
// Открываем основной файл для чтения
$handle = fopen($file, 'r');
// Преремещаемся на стартовую позицию
fseek($handle, $offset, SEEK_SET);
// Читаем строку
$buffer = fgets($handle);
// Закрываем файл
fclose($handle);
return $buffer;
}
echo charRead('1.txt', 3000000);
Очень легко и быстро. Функция принимает аргументами путь до файла, номер строки, с которой начинать чтение, и опционально (не обязательный параметр) заданную ранее длину строки.
А можно прочитать заданное количество строк, добавив еще один параметр (количество). За одно уберем пробелы - заполнители и представим результат в виде массива, как это сделала бы функция file()
<?php
function charRead($file, $start, $lenght, $size = 100)
{
$buffer = array();
// Вычисляем стартовую позицию,
// добавляя к каждой строке один байт на символ переноса
$offset = $start * $size + $start;
// Открываем основной файл для чтения
$handle = fopen($file, 'r');
// Преремещаемся на стартовую позицию
fseek($handle, $offset, SEEK_SET);
// Складываем построчно нужный фрагмент в массив
// попутно очищая от пробелов-заполнителей
while($lenght--)
$buffer[] = trim(fgets($handle));
// Закрываем файл
fclose($handle);
return $buffer;
}
print_r(charRead('1.txt', 3000000, 10));
Вот примерно по такому принципу организовано храенение данных в базе MySQL тип поля char. Не зря мы так назвали функцию.
Спустя 48 секунд (11.06.2010 - 23:11) twin написал(а):
Вот.
Спустя 58 секунд (11.06.2010 - 23:11) twin написал(а):
я потом еще кучу выложу. Готовил статью на потом, вынудил
Спустя 2 минуты, 29 секунд (11.06.2010 - 23:14) KaFe написал(а):
А про не фиксированную длину
Спустя 2 минуты, 39 секунд (11.06.2010 - 23:17) twin написал(а):
Потом, говорю же.
И, кстати. Я не просто так спросил, откуда файл. Если свой - стоит задуматься.
И, кстати. Я не просто так спросил, откуда файл. Если свой - стоит задуматься.
Спустя 21 день, 18 часов, 59 минут, 34 секунды (3.07.2010 - 18:16) KaFe написал(а):
twin и все остальные , у меня еще вопрос, сейчас он касается такого аспекта, есть ли в ПЫХе такая штука,что бы из файла можно было вырезать определенное количество байт из определенного место при том не прибегая к полной перезаписи файла.
Спустя 1 час, 36 минут, 48 секунд (3.07.2010 - 19:53) twin написал(а):
Нет. Нету. Обычно это делается через промежуточные файлы.
Спустя 2 минуты, 18 секунд (3.07.2010 - 19:55) KaFe написал(а):
Цитата (twin @ 3.07.2010 - 16:53) |
Нет. Нету. Обычно это делается через промежуточные файлы. |
Это так жестоко
Спустя 6 минут, 46 секунд (3.07.2010 - 20:02) KaFe написал(а):
Еще вопрос, если у меня есть файл я в него пишу данные, потом определяю от куда начинается и где конец добавленных данных, и заношу эти значение в индекс, который в дальнейшем сможет прочитать эти данные. Возникает вопрос вот в чем, если я удалю индекс то нет проблем все как бы данных не существует, а на самом деле они там остались, как мне их удалять?....Ведь если я буду добавлять и добавлять данные а старые не удалять там же будет куча ненужного хлама. Надеюсь мена поняли.
Спустя 35 минут, 3 секунды (3.07.2010 - 20:37) Basili4 написал(а):
ИМХО при больших объемах информации и одновременных подключениях надо отказываться от использования файлов и смотреть в сторону БД файл с 100 мтрами инфы это много а таблица со 1000 метрами с продуманной структурой это даже не проблема.
Спустя 10 часов, 9 минут, 31 секунда (4.07.2010 - 06:47) KaFe написал(а):
Basili4 А я из принципов не хочу использовать БД, мне хочется файлы. И вообще я знаю о плюсах использования БД не надо мне это 100ый раз повторятт
Спустя 59 минут, 14 секунд (4.07.2010 - 07:46) twin написал(а):
Цитата |
Возникает вопрос вот в чем, если я удалю индекс то нет проблем все как бы данных не существует, а на самом деле они там остались, как мне их удалять?....Ведь если я буду добавлять и добавлять данные а старые не удалять там же будет куча ненужного хлама. Надеюсь мена поняли. |
Если тебе известно про базы данных, то изучай, как они устроены. Ибо ты сейчас пытаешься сделать тоже самое.
В MySQL это решается оптимизацией таблицы. Есть такая команда
OPTIMIZE TABLE, вот она и занимается уборкой этого хлама. А фактически перезаписывает файл, удаляя ненужную информацию.
Спустя 10 дней, 6 часов, 53 минуты, 50 секунд (14.07.2010 - 14:40) KaFe написал(а):
twin Я все давно знаю. Просто я хочу сделать нормальный инструмент для работы с файлами на php. Ладно о чем это я.
Вопрос дня.
локируется ли файл файл при функции file_put_contents
Вопрос дня.
локируется ли файл файл при функции file_put_contents
Спустя 1 час, 4 минуты, 44 секунды (14.07.2010 - 15:44) twin написал(а):
Да. Еще как.
Спустя 2 минуты (14.07.2010 - 15:46) KaFe написал(а):
Спасибо twin Один ты мне помогаешь!
Спустя 6 минут, 49 секунд (14.07.2010 - 15:53) sergeiss написал(а):
А я знаешь, почему я не хочу помогать? Потому что для таких целей и сделаны БД разные
Спустя 1 минута, 39 секунд (14.07.2010 - 15:55) Basili4 написал(а):
ну будет еще одна самая лучшая KaFeSQL называтся будет
Спустя 13 минут, 41 секунда (14.07.2010 - 16:09) KaFe написал(а):
sergeiss, Basili4 Мне в кайф это делать, если не хотите помогать то вот вам
Спустя 19 минут, 1 секунда (14.07.2010 - 16:28) Basili4 написал(а):
KaFe
Дык и мы и помогаем на путь тебя истинный вывести хотим. Путь просветления БДизм называется
Дык и мы и помогаем на путь тебя истинный вывести хотим. Путь просветления БДизм называется
Спустя 1 час, 2 секунды (14.07.2010 - 17:28) KaFe написал(а):
Basili4 как жаль я Атеист.
Спустя 8 минут, 26 секунд (14.07.2010 - 17:36) Michael написал(а):
Чисто с точки зрения принципов хранения информации:
один файл эквивалентен одной ячейке таблицы.
один файл эквивалентен одной ячейке таблицы.
Спустя 13 минут, 13 секунд (14.07.2010 - 17:49) KaFe написал(а):
Michael
Цитата (Michael @ 14.07.2010 - 14:36) |
Чисто с точки зрения принципов хранения информации: один файл эквивалентен одной ячейке таблицы. |
о как, и где это написано или сказано???
Спустя 9 минут, 11 секунд (14.07.2010 - 17:58) Michael написал(а):
Что такое база данных? Это по существу - набор порций информации, существующей в течении длительного времени.
В правильно спроектированной БД, одна порция информации хранится в одной ячейке (1-ый закон нормализации)
Файл с этой точки зрения тоже представляет собой одну порцию информации. Потому что нет автоматических средств вытягивания из файлов "любых" данных. Если в файле хранить много разных данных, то придется писать к каждому типу файла свой алгоритм на выборку. А это уже не база данных.
В правильно спроектированной БД, одна порция информации хранится в одной ячейке (1-ый закон нормализации)
Файл с этой точки зрения тоже представляет собой одну порцию информации. Потому что нет автоматических средств вытягивания из файлов "любых" данных. Если в файле хранить много разных данных, то придется писать к каждому типу файла свой алгоритм на выборку. А это уже не база данных.
Спустя 3 часа, 51 минута, 58 секунд (14.07.2010 - 21:50) KaFe написал(а):
Michael ну если ты так считаешь, не буду тебя переубеждать, кажись теорию реляционных баз данных знаешь
А если тебе понадобится работать на объектно-ориентированных и сетевых бД ты также будешь говорить??
А если тебе понадобится работать на объектно-ориентированных и сетевых бД ты также будешь говорить??