Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Идентификаторы в Mysql / 25 сообщений из 26, страница 1 из 2
13.01.2014, 02:52:48
    #38523805
dima19007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
Добрый день, хотел бы описать свою задачу и получить помощь в ее решении.

1. Вариант
Требуется сделать двойные идентификаторы в mysql таблице, один сквозной по таблице, второй для каждого пользователя свой, для того, чтобы у каждого пользователя был свой счетчик идентификаторов, например после регистрации на сервисе и после добавления товара, его товар получил бы ID = 1, а внутри система это скажем бы был уже сотый товар с ID = 100. Как правильно реализовать?

2. Вариант
Использование символьного составного идентификатора, например id организации и id товара в одном идентификаторе, например Org10Tovar100, где Org10 идентификатор организации, а вторая часть Tovar100 для каждого нового пользователя начиная с 1.

Как сделать эксперты? Возможно в связке с PHP
...
Рейтинг: 0 / 0
13.01.2014, 05:01:31
    #38523815
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
dima19007,

1. составные идентификаторы в одном поле -- зло.

2. Сделайте отдельные поля:

ид инт ПК, автоинкремент
юзер_ид инт ФК на таблицу юзеров
юзер_посишн инт -- отдельный счетчик для конкретного юзера

3. в зависимости от конкурентности системы,
поле позиции можно считать как
селект МАХ(посишн) + 1 ....
или более конкурентно-устойчивыми способами.
...
Рейтинг: 0 / 0
13.01.2014, 07:27:55
    #38523836
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
dima19007,

У вас явная неполнота условий. В первой части вы хотите единый идент для всех товаров и "локальный для ПОЛЬЗОВАТЕЛЯ", а во второй у вас также версия единого идента в составном виде, но УЖЕ по организациям, и локально опять же для ПОЛЬЗОВАТЕЛЯ.

Отсюда, мой ХШ говорит, что у вас товары, всеж-таки по организациям, но вы "почему-то" их связываете 1-1 с пользователями... то есть, если "хозяин" фирмы уволился или перешел к конкуренту, все товары фирмы потянутся за ним, так?

Я к чему: уточните сколько сущностей по которым нужна локальная идентификация товаров 1 или 2?

Я делал так: товар привязан к фирме, через форейнключ на фирму, владелицу товара. А идент глобальный - это ПК таблицы товаров. Пользователи - это отдельная ссущность, которая также может иметь ссыль на фирму, в которой оно работает... а может и НЕ иметь (ничей юзверь). В профиле пользователя есть признак, типа "товаровед", который разрешает оному редактировать товары фирмы. Это чтобы не каждый продаван фирмы, а только допущенный мог редактировать товары... но это тоже - свойство юзверя с привязкой к фирме.

Вот, через общую привязку к фирме, её товары и показываются/редактируются пользователем. Зачем ему нумерация? Но, если она нужна - можете из каждого общего идента товаров при показе вычитать первый (наименьший), да хоть на клиенте...
...
Рейтинг: 0 / 0
13.01.2014, 10:34:13
    #38523930
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
Сорь за оффтоп, но это пять!
Arhat109Пользователи - это отдельная ссущность, которая также может иметь ссыль на фирму, в которой оно работает...
...
Рейтинг: 0 / 0
13.01.2014, 10:40:30
    #38523936
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
Arhat109Пользователи - это отдельная ссущность, которая также может иметь ссыль на фирму, в которой оно работает... а может и НЕ иметь (ничей юзверь).А может иметь и несколько ссылей - торговый агент или совместитель, к примеру...
...
Рейтинг: 0 / 0
13.01.2014, 11:59:37
    #38524069
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
Akina,

Можно и так, но тогда надо делать отдельную табличку связи. На товарных сайтах такая детализация как правило не нужна. Там нужен юзверь, который может редактировать товары фирмы. А хде он ишо пашет - фиолетово. Часто сайты предлагают разный интерфейс продажникам и снабженцам... вот для ентого случаю и надо. Вдруг у фирмы несколько юзверей...
...
Рейтинг: 0 / 0
13.01.2014, 12:29:26
    #38524132
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
Arhat109На товарных сайтах такая детализация как правило не нужна. Там нужен юзверь, который может редактировать товары фирмы.
Обычно аккаунт привязан к юзеру, а не к фирме. Кстати, без этого разграничение прав не организовать.
А вот является там юзер самостоятельной единицей безопасности, или он входит в пул единиц безопасности фирмы - тут может быть и так, и эдак. Второе, конечно, проще, зато первое удобнее конечному пользователю.
Например, в мелких Инет-магазинах обычно вторая схема, а в крупных как правило первая.
...
Рейтинг: 0 / 0
13.01.2014, 12:38:21
    #38524146
dima19007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
javajdbc,

у меня была такая же мысль, но смущает использование max(id+1) и как это поведет себя при большом количестве пользователей.

Сущности две:

1. Организация
ID (автоинкремент)
Name

2. Товар
Внутренний Id (автоинкремент)
Локальный Id (для каждой организации с ID = 1)
ID организации

И еще вопрос: как безболезненно перейти к применению локальных идентификаторов в каждой организации, если сейчас используется сквозная

P.S. Остальным комментаторам, не усложняйте пожалуйста исходную задачу, разграничение прав и пользователи не нужны, нужен принцип хранения и оперирования двумя сущностями
...
Рейтинг: 0 / 0
13.01.2014, 12:42:05
    #38524155
dima19007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
Мое видение:
Перед добавлением товара, вызывается какая-либо функция, которая устанавливает в качестве параметра текущую организацию и затем производятся обычные
insert into tovar name = 'test';
update tovar set name = 'test2' where id = локальный id;

то есть не заморачиваясь на сквозной идентификатор. Это самый удобный вариант.
...
Рейтинг: 0 / 0
13.01.2014, 12:54:58
    #38524187
dima19007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
По второму варианту, очень хороший пример организации идентификаторов в системе у Salesforce нашел

http://help.salesforce.com/apex/HTViewSolution?id=000004383&language=en_US

но как реализовать что-то подобное не знаю
...
Рейтинг: 0 / 0
13.01.2014, 12:57:49
    #38524199
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
Я правильно понимаю, что для каждого пользователя (ака фирма) свойства внутреннего счётчика должны полностью эмулировать автоинкремент? т.е. не должно быть никаких идиотских заморочек вроде повторного использования идентификатора после дуаления товара?

Если так - то такой счётчик становится атрибутом пользователя, и должен храниться в таблице пользователей. А как организовать при этом его использование и пересчёт - дело уже десятое. Я бы пошёл по пути "никаких запросов" - т.е. заносить товары исключительно вызовом соотв. процедуры, которая и обеспечит необходимый пересчёт. А для верного - ещё создал бы соотв. уникальный индекс.
...
Рейтинг: 0 / 0
13.01.2014, 12:59:58
    #38524206
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
dima19007вопрос: как безболезненно перейти к применению локальных идентификаторов в каждой организации, если сейчас используется сквозная
А это подробно рассмотрено в ФАКе...
...
Рейтинг: 0 / 0
13.01.2014, 13:02:08
    #38524209
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
PS. Если же стоИт задача ОТКАЗАТЬСЯ от сквозной нумерации - возможно, неполохим решением может быть партиционирование по фирме. Тогда в каждой партиции - свой ключ-автоинкремент, и никаких проблем. Их плохого - DDL при изменении списка фирм.
...
Рейтинг: 0 / 0
13.01.2014, 13:18:07
    #38524235
dima19007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
Akina,

Что есть сейчас: Проект с сквозными идентификаторами.

То есть пользователь, который сейчас зарегистрируется в системе и добавит товар, увидит идентификатор товара 100500, а нужно ID = 1

Задача: Необходимо добавить локальные идентификаторы

Оставив при этом сквозные идентификаторы, для оперирования в админке.
Пользователю показывать локальные.
...
Рейтинг: 0 / 0
13.01.2014, 13:25:09
    #38524249
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
Тогда 15407482
...
Рейтинг: 0 / 0
13.01.2014, 13:35:43
    #38524271
dima19007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
Akina,

Извините но ваш комментарий не добавил мне ясности по вопросу...
...
Рейтинг: 0 / 0
13.01.2014, 13:52:21
    #38524295
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
Что именно осталось непонятым?
...
Рейтинг: 0 / 0
13.01.2014, 13:58:59
    #38524316
dima19007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
Akina,

Как организовать хранение в Mysql и как обрабатывать записи с учетом локальных идентификаторов. На примере запросов или возможно хранимой процедуры
...
Рейтинг: 0 / 0
13.01.2014, 14:16:10
    #38524348
dima19007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
http://club.shelek.ru/viewart.php?id=317
то что нужно, но у меня тип Innodb
...
Рейтинг: 0 / 0
13.01.2014, 14:53:01
    #38524409
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
Ок. Чисто шаблонно (no syntax, без учёта мультидоступа, чисто идея).

Имеется набор таблиц:

Код: sql
1.
2.
create table client (id int, name text, primary key(id));
create table good (id int, id_client int, name text, primary key(id), key(id_client) fk client(id));


Соответственно good.id - это сквозная нумерация. Необходимо ввести нумерацию для клиентов.

Процесс ведём при запрещённом изменении данных.

Первая модификация - добавить в таблицу товаров поле для сквозной нумерации в разрезе клиента.
Код: sql
1.
alter table good add column id_for_client int



Далее - выполнить нумерацию в группе с заполнением этого поля.
FAQ: Нумерация строк и другие вопросы про использование переменных - этапы 1 и 2 преобразовать во VIEW, использовать в UPDATE.

Затем - наложить требование уникальности в группе.
Код: sql
1.
alter table good add unique key (id_client, id_for_client)



Затем модифицировать таблицу юзеров.
Код: sql
1.
alter table client add column max_good_id int



Заполнить её данными
Код: sql
1.
2.
3.
update client, (select id_client, max(id_for_client) max_good_id from good group by id_client) maxs
set client.max_good_id = maxs.max_good_id
where client.id = maxs.id_client



И последнее - создаём процедуру добавления товара
Код: sql
1.
2.
3.
4.
5.
6.
create procedure add_good(idclient, good_name)
begin
select max_good_id + 1 into @maxs from client where id_client=idclient
insert into good(id_client, name, id_for_client) values (idclient, good_name, @maxs)
update client set  max_good_id = @maxs where  id_client=idclient
end
...
Рейтинг: 0 / 0
13.01.2014, 15:00:57
    #38524431
dima19007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
Akina,

Спасибо за подробный ответ.
Насколько правильно использовать операцию max + 1?
Можно ли ее как либо заменить, в mysql sequence не поддерживается?
...
Рейтинг: 0 / 0
13.01.2014, 15:14:29
    #38524464
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
dima19007Насколько правильно использовать операцию max + 1?
При озвученных ограничениях - нормально.
dima19007в mysql sequence не поддерживается?
Ммм... вот даже не знаю, что бы тебе сейчас и сказать-то...
...
Рейтинг: 0 / 0
13.01.2014, 15:23:30
    #38524491
dima19007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
Akina,

max + 1 не красивое решение...
по sequence вопрос остается.
и как заменить max + 1 тоже
...
Рейтинг: 0 / 0
13.01.2014, 22:35:43
    #38525058
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
Akina,

Речь была не про это. С правами - это чисто для примеру разных пользователей от одной фирмы.

Речь о том, что "локальный" идентификатор непонятно к чему: то ли товары фирмы надо нумеровать с нуля, то ли пользователя от этой фирмы ... а если их у фирмы 2шт, что тогда? у каждого пользователя своя нумерация али как?

Насколько понимаю сейчас - у ТС-а не различается "пользователь" и "фирма". Но, опять же, остается непонятным характер локальной нумерации, вот к примеру:

1. Пронумеровали товары фирмы 1 .. 100. А потом товар 1 удалили. Как показывать? как 2 .. 100 или 1..99? А если удалили 53-й товар, что тогда?

2. Уникальность локального нумератора, она какова? И это не только к вопросу "а можно ли записать новый товар под номером удаленного"... а может это ... артикул?

Я к тому, что без дополнительных подробностей - фиг чё посоветуешь.
...
Рейтинг: 0 / 0
13.01.2014, 22:47:37
    #38525062
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификаторы в Mysql
Arhat109 , 15407269 отвечает на эти вопросы. Эмуляция автоинкремента. Удалённые - не заполняются.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Идентификаторы в Mysql / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]