• Как хранить в БД права доступа?

    agathis
    @agathis
    Хм, несколько соображений:
    1. — доступно друзьям
    — доступно конкретному другу/списку друзей

    по сути одно и то же. «доступно друзьям» = «Доступно списку друзей, совпадающему с френд-листом». возможно дешевле будет хранить две копии списка друзей, одна во френд-листе, одна в таких, денормализация — это вовсе не всегда плохо.

    2. OR в запросе — прощай индекс. Почему не использовать юнион и два раза доступ по разным индексам? Один раз все публичные записи, второй — для списка друзей. Публичность хранить отдельным столбцом в content — не самое элегантное, но самое простое.

    ИЛИ

    создаем такую структуру:

    table groups
    (id_group number,
    id_user number,
    id_friend number);

    table permissions
    (id_permission number,
    id_content number,
    id_group number);

    В таблице user указать «дефолтную» группу, совпадающую с френд-листом, соответственно ее обновлять.
    Каждое новое разрешение «другу или списку» порождает новую группу и новый пермишен, разрешение «друзьям» — запись в permissions с указанием на дефолтную группу.

    Запись в permissions без группы значит «доступно всем».
    И делаем так:
    SELECT * FROM content WHERE id IN (SELECT p.id_content FROM permissions p LEFT JOIN groups g ON p.group = g.id WHERE g.friend = #me#);
    Ответ написан
  • Тормозящий Prepared statement на Oracle

    agathis
    @agathis
    Ну так план же не самоцель (и Oracle CBO вовсе не такой глупый, например :)).
    Я предлагаю посмотреть статистику реального выполнения по buffer gets, и если там все хорошо, расслабиться и получать удовольствие.
    Ответ написан
  • Тормозящий Prepared statement на Oracle

    agathis
    @agathis
    Непонятно, кстати, откуда в первом плане эстимейт в 312 миллионов строк, если партиций всего 48 и из каждой по 20 строк.

    А вообще это не новость, что план с литеральными переменными обычно чуть (или даже не чуть) производительнее, чем с bind variables.

    Вам тут смотреть в сторону фиксации плана, наверное.
    Ответ написан
  • Как проверить строку на предмет соответствия списку шаблонов (LIKE)?

    agathis
    @agathis
    Тут вступаем на скользкую почву, mysql я видел один раз лет десять назад :)

    Исходя из общих соображений, однако (решение в лоб):
    SELECT UNIQUE s.string FROM strings s JOIN templates t ON s.string LIKE t.template

    Если в мускуле можно делать селекты прямо из коллекций, пусть strings будет такой коллекцией, если нет — писать строки во временную таблицу.
    С join condition можно поэкспериментировать, например использовать regexp_like (или как это нызвается в mysql?)
    Ответ написан
    Комментировать
  • Какой планшет купить в машину?

    agathis
    @agathis
    Не буду оригинален, но Nexus 7? Лишняя производительость присутствует, правда :)
    Ответ написан
    Комментировать