Список уникальных адресов сайтов

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

    Сайт можно идентифицировать по имени домена. Если бы мы жили в идеальном мире, то на этом месте мой пост бы и закончился. :) Но, тут всё только начинается…

    Большинство сайтов доступны (отдается HTML или происходит редирект) по двум адресам: example.com и www.еxample.com. В почти идеальном мире :) мы бы просто отбросили “www.” и забили на эту проблему. Но находятся некоторые криворукие личности, которые обеспечивают работу своего сайта только по одному адресу, “только с www.”.

    Решение проблемы такое:
    CREATE TABLE test(www CHAR(4),hostname CHAR(64) NOT NULL,UNIQUE(hostname));

    Мы отделяем частицу “www.” и храним её отдельно, все равно смысловой нагрузки она никакой не несет. Зато теперь по нормальному имени домена можно сделать уникальный индекс.

    Чтобы сделать выборку по такой таблице, можно создать отображение (VIEW), а можно просто добавить оператор CONCAT в SELECT:
    SELECT CONCAT(www,hostname) AS url FROM test;

    З.Ы. “www.” — это архаизм, это неудобно и непрактично. Давайте обойдемся без дискуссий на эту тему. ;)
    З.Ы.Ы. А ещё я когда-то писал о том, как лучше сделать редирект для своего сайта с «www.» на обычную версию: Tips&Tricks.

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 27

      +1
      отличная идея!
        –1
        Можете считать меня старпером, но мне визуально "www.hostname.com" больше нравится, нежели просто "hostname.com"...
        Хотя много зависит от имени домена, иногда "www" там, действительно, не в тему.
          –1
          присоединюсь к мнению.
          (только скорее консерватор, а не старпер :)
            0
            да тут дело не в красивее. быстрее набрать some.com, чем http://www.some.com.
            Хотя www. можно оставить для красивых ссылок :)
              +1
              быстрее some, затем Ctrl+Enter
            +1
            А если просто для "кривых" сайтов хранить http://www.example1.com, а для нормальных example2.com?
            А если все-таки использовать ваше решение, то логичнее было бы www хранить не текстом (4 байта), а признаком присутствия (в лучшем случае 1 бит).
              0
              конечно в первой ссылке имелось ввиду без http:// - хабр постарался :)
                0
                1. как вы будете определять, какой кривой, а какой - нет?
                2. Если делать VIEW, то можно и BOOLEAN сделать, а так - проще использовать CONCAT.
                  0
                  1. в вашем варианте это все равно ведь надо определять?
                  2. проще, но накладнее в смысле памяти и времени доступа.
                    0
                    1. нет, не нужно ничего определять. Просто разделяется URL на две части.
                      0
                      Но ведь вы как-то определяете, что в нормальном example1.com не нужно хранить www, а в "кривом" http://www.example2.com - нужно?
                      А введение лишнего столбца лишь для того, чтобы перенести на движок БД заботу об уникальности, мне кажется излишним... На крайний случай, если не хочется делать лишние телодвижения в коде, можно поставить триггер срабатывающий при добавлении и проверяющий url с www и без оного.
                        0
                        > Но ведь вы как-то определяете, что в нормальном example1.com не нужно хранить www, а в "кривом" http://www.example2.com - нужно?
                        Как введут адрес, так и буду хранить. Введут с www, буду хранить с www, нет - значит нет.

                        > А введение лишнего столбца мне кажется излишним...
                        Знаете решение лучше? ;)
                          0
                          > Как введут адрес, так и буду хранить. Введут с www, буду хранить с www, нет - значит нет.
                          Вот таким же способом можно хранить и в предложенном мной варианте.
                          > Знаете решение лучше? ;)
                          Свой вариант я уже описал. Я не утверждаю, что он лучше, а просто предлагаю другой вариант, который с моей точки зрения считаю более правильным. Он, кстати, будет учитывать и нижеприведенный пример с разным содержимым.
                            0
                            > Свой вариант я уже описал.
                            Вы фигню какую-то написали. Ещё раз спрашиваю, как вы собираетесь определять, какой кривой, а какой - нормальный? У меня ничего определять не надо.
                    +1
                    CONCAT(IF(www, 'www', ''), host)
                  +1
                  А вы никогда не видели примеров, что у http://www.site.ru и site.ru разное содержимое
                    0
                    Это вообще самый большой бред который я видел пару раз, таким сайтоделам сразу руки отрывать
                    Я бы вообще www у сайта насильно убирал, руки из задницы — сами виноваты
                      +2
                      К счастью, Вы ничего не можете с этим сделать.
                        0
                        ябы сказал к сожалению...
                        0
                        вы слишком категорично рассуждаете, например версия с www может быть для внешних пользователей, а без www вход с логином и паролем для внутренних
                          0
                          я рассуждаю так только потому, что для понимания сайт с www и без уже считается синонимом, если надо разделить версии сайта то вводят другие поддомены
                            +2
                            Насчет разного содержимого - нормально рассуждает. Вы знаете, какой смысл у субдомена "www.", когда и для чего его придумали?! То, что вы написали - глупость, не нужно так делать.
                              0
                              проблема от вашего непонимания структуры.
                              Рассмотрим пример. http://www.habrahabr.ru
                              Домен первого уровня ru, Домен второго уровня habrahabr.ru - принадлежит пользователю, домен третьего уровня http://www.habrahabr.ru и т.д.
                              Как администратор хочет, так он и настраивает домены уровня больше или равного двум. Остальное относится исключительно к тем целям, которые вы преследуете и к вашей квалификации как программиста.
                        0
                        Автор, поясните пожалуйста, зачем для каждой записи хранить 4 обязательных байта в виде колонки char(4)? Почему вы не используете bit, к примеру для MS SQL или схожие типы у других СУБД?
                          +1
                          где-то возможно даже на хабре один умный человек сказал, что www очень хорошо выделяет адрес сайта в offline`е - в книгах, газетах, журналах, визитках. я с ним полностью согласен. поэтому сайт должен одновременно существовать по site.name и http://www.site.name - но он должен быть одинаковым, или можно использовать редирект
                            0
                            Простите, а как вы будете спать зная, что есть некие *.net.ru *.org.ru и даже высказав своё фи, вы позволите себе забить на к примеру *.mit.edu и даже тот же *.gov.ru да и прочие подобные "архаизмы" - не будте так честолюбивы и узколобы, ваше стремление видеть доменные записи вида домен.зона, абсурдны, к сожалению предлоежнная вами структура таблиц нежизнеспособна в реальности.
                              0
                              к сожалению, при данной реализации не сделаешь проверки адресов на существование...

                              Only users with full accounts can post comments. Log in, please.