Чому назви таблиць / стовпців / індексів Oracle обмежені 30 символами?


149

Я можу зрозуміти, що багато років тому існувало б таке обмеження, але в даний час, безумовно, ця межа легко може бути збільшена. У нас є умови іменування об'єктів, але завжди існує випадок, коли ми виявляємо цю межу - особливо в іменуванні сторонніх ключів.

Хтось насправді знає, чому це не більший розмір - чи він більший у 11 г?


Очевидно, відповідь полягає в тому, що він порушить поточні сценарії, які не кодуються захисно. Я кажу , що це дуже тривожна річ, Oracle намагається бути в базі даних, звичайно , це та річ , яку ви повинні постійно покращувати, інакше ваш продукт буде померти смертю тисячі скорочень.

Щоразу, коли я бачу подібне заперечення вдома, я думаю, що настав час відкусити кулю і розібратися. Якщо люди виконують сценарії, які вони не перевіряють і не підтримують під час оновлення версій Oracle, то нехай вони понесуть наслідки цього вибору. Надайте їм прапор сумісності, розміром до 4000, а потім заощадите мені витрачений час, коли я створюю об’єкти, що потрібно постійно рахувати до 30, щоб перевірити ім'я "ОК".


3
Оскільки має бути обмеження? Зробіть це 64 символи, і ви, ймовірно, знайдете когось, запитуючи, чому це не 128 і т.д.
Голова

45
Правда, але 30 - це дуже короткий шнурок. Чому не може бути 4000 - розмір Varchar2 - дійсно бачиться Oracle, як довго він розбирає запит?
Кріс Гілл

22
@TheChairman PostgreSQL обмежує мене до 63 символів, і у мене ніколи не було проблем з цим обмеженням довжини. Він досить великий, щоб мої імена підходили, і якщо я розглядаю більш довге ім’я, саме час почати думати про негативний вплив на читабельність. З іншого боку, я часто стикаюся з обмеженням довжини імен в Oracle і змушений зменшити читабельність свого імені через обмеження 30 символів. Кілька людей можуть скаржитися на 64-меж, але у багатьох людей вже є проблеми через обмеження 30 символів. Йдеться про зустріч з 99% випадків використання, і Oracle тут не вдається.
jpmc26

1
Давай, Оракуле, ти став динозавром! Microsoft робить гарну роботу, щоб зробити SQL-сервер більш дружним. Тепер розслабте обмеження довжини імені.
user3454439

1
Перемотка вперед до Oracle 12cR2, тепер це 128 байт замість 30 :-) docs.oracle.com/en/database/oracle/oracle-database/12.2/newft/…
Стефан Л

Відповіді:


71

Я вважаю, що це стандарт ANSI.

Редагувати:

Власне, я думаю, що це стандарт SQL-92.

Здається, що пізніша версія стандарту додатково містить 128 імен символів, але Oracle ще не підтримує це (або має часткову підтримку, наскільки це дозволяє 30 символів. Ммм.)

Шукати на цій сторінці "F391, довгі ідентифікатори" ... http://stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/ap_standard_sql001.htm

(Шукаю посилання)


1
Гм, це не я читав цей документ. Мені кажуть, що F391 є елементом у специфікації SQL / Foundation (що б там не було), і Oracle має часткову підтримку для цього, з обмеженням 30 символів.
skaffman

21
Частково відповідність. Який жарт. "наші гвинти частково відповідають метричним стандартам, за винятком того, що вони не є метричними."
Jens Schauder

5
Я детально не читав специфікацію F391, але я припускаю (можливо, неправильно), що "Довгі ідентифікатори" означають збільшення довжини ідентифікатора з 30 до 128. Тож кажучи, що ви "частково" підтримуєте це, дозволяючи 30 символів, трохи нахабний. Ви не підтримуєте новий стандарт, ви все ще підтримуєте старий стандарт (хоча і 25% шляху до нового стандарту) Це мало сенс? !!?
cagcowboy

7
Стандарт SQL-92 тут contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt , але якщо ви читаєте розділ "17.1 Опис областей дескриптора елементів SQL", він говорить, що такі ідентифікатори, як імена та схеми, повинні містити щонайменше 128 символів.
Рік

46
Сам факт, що фанати Oracle не бачать корисності 30+ ідентифікаторів символів, викликає занепокоєння. "Зробіть свої імена значущими / описовими, використовуйте підкреслення замість корпусу верблюда та тримайте менше 30 символів". Це ніколи не перевищуватиме 30 символів. Амірит? Більше схоже на скорочення скорочень і коли жодне з назв не має сенсу, проводьте цілий день, читаючи / оновлюючи документацію.
Адам Джонс

45

На додаток до точки зору cagcowboy, що вона походить від стандарту SQL (історично я підозрюю, що рішення Oracle призвели до стандарту SQL, оскільки Oracle передував стандартизації SQL), я б загрожував, що велика частина небажання дозволяти довші ідентифікатори походить від усвідомлення того, що є мільйони DBA з мільйонами користувацьких сценаріїв, за якими всі вважають, що ідентифікатори мають довжину 30 символів. Дозволення кожного рядка коду, який має щось подібне

  l_table_name VARCHAR2(30);
BEGIN
  SELECT table_name
    INTO l_table_name
    FROM dba_tables
   WHERE ...

раптом зламатися, оскільки DBA 15 років тому використовував VARCHAR2 (30), а не DBA_TABLES.TABLE_NAME%TYPEза сценарієм, викликав би масовий бунт. Я б став на загрозу, що тільки в Oracle є тисячі місць, де ця річ робилася протягом багатьох років у різних пакунках та компонентах. Переобладнання все , що існуючий код для підтримки довших ідентифікаторів буде величезним проектом , який майже напевно генерувати шляхом більше витрат під час розробників, QA час, і нововведені помилки , ніж це було б генерувати вигоди.


13
+1 Це майже напевно одне з багатьох спадкоємних дизайнерських каліків Oracle.
skaffman

43
Безумовно, настав час виростити пару і збільшити її - додайте прапор, щоб DBA змогли вдосконалити його назад до 30. Спадкові питання, як це, завжди слід зіштовхувати і сортувати, інакше в кінцевому підсумку покалічить всю базу коду, і люди просто перейдуть на щось інше
Chris Gill

6
Не тільки мільйони рядків написаного коду DBA, але й безліч внутрішнього коду Oracle, без сумніву. Ця тема виникла на сесії зі Стівеном Фейерштейном, і він сказав, що не думає, що коли-небудь це змінить.
Меттью Уотсон

10
Вони не змогли б точно заграти як нову функцію ... вони витратили б багато часу, продовжуючи ліміт, а потім оголосили, що "тепер ви можете використовувати імена, що перевищують 30 символів!". Вони були б сміхом.
skaffman

9
Якщо ви все ще використовуєте 15-річні сценарії, щось вкрай не так . Крім того, їх виправлення буде одноразовою вартістю (можливо, ще трохи для продовження технічного обслуговування), тоді як розробники продовжуватимуть марно витрачати час на крайню роботу над жахливо скороченими іменами. @skaffman Вони вже є сміхом, що його не виправили (і безліч інших дизайнерських рішень, які є пафосними в сучасну епоху, як, наприклад, не булеві або автоматичні збільшення), що стосується мене.
jpmc26

11

Я переглянув це питання і виявив це запитання через Google, але також з’ясував, що станом на Oracle 12c випуску 2 (12.2) це вже зовсім не так. ( https://oracle-base.com/articles/12c/long-identifiers-12cr2 )

У якийсь момент кожен DBA або розробник потрапить у точку, коли обмеження 30 символів для імен об'єктів спричинило проблему. Цей ліміт може бути надзвичайно болісним при виконанні міграційних проектів із SQL Server або MySQL до Oracle. В базі даних Oracle 12cR2 максимальна довжина більшості ідентифікаторів тепер становить 128 символів.

Це нова функція в 12.2, згідно ( http://blog.dbi-services.com/oracle-12cr2-long-identifiers/ ). Згідно з цією посадою, 12,1 ще обмежувався 30 символами.


Редагувати: Ось посилання на офіційну документацію Oracle, що пояснює зміни. ( https://docs.oracle.com/cloud/latest/exadataexpress-cloud/CSDBF/longer-identifier-names.htm#CSDBF-GUID-F4CA155F-5A37-4705-8443-0A8C9E3F875C )

Починаючи з бази даних Oracle 12c, випуск 2 (12.2), максимальна довжина імен ідентифікаторів для більшості типів об’єктів бази даних збільшена до 128 байт.


128 байт / 4 байти (Unicode) = 32 символи. Принаймні, як я розумію, що 4 байти для символів, які не є Unicode, це не рідкість? Мені потрібно задуматися, чи це означає лише те, що вони зараз підтримують Unicode? Так само VARCHAR2(2)не означає 2 символи, а 2 байти.
Сет

1
Я бачу вашу думку, але символи та байти залежать від набору символів у вашій базі даних. Цей параметр визначає кодування для типів даних char (таких як varchar2), а також кодування для ідентифікаторів db. Це суперечить національному набору символів, який використовується для типів даних nchar. Так так, якщо у вас є таке кодування, що ваші ідентифікатори використовують 4 байти на символ (якщо припустимо, що такий може використовуватися як набір символів БД), у вас зараз буде 32 замість 7. Але я думаю, що для більшості випадків використання ідентифікаторів було б однобайтові символи.
Канмурі

6

Враховуючи практичну необхідність обмежень довжини ідентифікатора, хороший дизайн обмежує довжину фактичних імен, щоб уникнути ударів у стелю, коли імена поєднуються між собою та з префіксами та суфіксами.

Наприклад, угода про іменування обмежень іноземних ключів

FK_<table1>_<table2> 

обмежує назви таблиць 13 символів або менше; у більшості баз даних знадобиться більше префіксів і суфіксів, що ще більше обмежує довжину назв таблиць.


5

Повідомляються про порушення обмежень у SQLERRM, який має обмеження до 255 символів, і який більшість клієнтів використовують, щоб зробити видимими помилки. Я підозрюю, що збільшення допустимого розміру імен обмежень суттєво вплине на здатність повідомляти про порушення (особливо, коли порушення обмеження було порушено через кілька шарів коду PL / SQL).


Отже, е, зробіть цю таблицю ширшою?
skaffman

2
Це не таблиця, але те, як клієнтське програмне забезпечення насправді отримує помилки з бази даних.
Гері Майєрс

@skaffman Довжина SQLERRM - це специфікація API / ABI. Змінити це означало б, що потрібно виправити кожен драйвер OCI на планеті (інакше переповнення буфера). Вони можуть змінити клієнта, щоб спочатку збільшити помилку в OCI 13, а сервер - на зразок Oracle 15, де клієнти OCI 10 більше не підтримуватимуться. (Можливо, вони навіть зараз це розглядають, але основна версія Oracle випускається лише кожні кілька років; і тоді ми все ще можемо зіткнутися з болем у оновленнях скриптів / додатків, коли додатки перейдуть на інший сервер / клієнт).
коуберт

4

Я вважаю, що довжина ідентифікатора 30 символів походить від COBOL, який був стандартизований наприкінці 1950-х. Оскільки програми COBOL були основним користувачем SQL (і SEQUEL до цього (і QUEL до цього)), це, мабуть, здавалося розумним числом для довжини ідентифікатора.


5
Я вважаю, що перша версія Oracle була написана у Fortran, яка, на мою думку, має обмеження довжини ідентифікатора 31. Можливо, це актуально.
Девід Олдрідж

4

Усі ці «обмеження» залишаються у відповіді на обмеження, накладені архітектурами процесорів, які звучать з 70-х років. З цього часу процесори еволюціонували до того, що ці обмеження більше не потрібні; вони просто залишилися. Однак їх зміна - велика угода для письменників RDBMS. Оскільки ці обмеження довжини впливають на все, що змінюється внизу, змінюючи його, мимоволі підходить, скажімо, довша назва процедури може і, ймовірно, порушить багато інших речей, таких як звітування про виконання, словник даних тощо, тощо, і так далі. Я зажадаю серйозного переписування Oracle RDBMS.


2

Пряма відповідь на питання полягає в тому, що стиль Oracle успадкований від старих ідей, в яких 30 здавалося багато, і набагато більше збільшило б ризик відкрутити кеш-словник із реальної пам'яті в типових базах даних.

На відміну від цього, простір імен ODBC походить з зовсім іншого місця, де набори даних витягуються швидко шляхом розбору таблиці на аркуші Excel і автоматично будуються таблиці баз даних із назвами стовпців, взяті з заголовків аркушів таблиць. Якщо ви думаєте, що це приводить вас до отримання ідентифікаторів, які навіть містять вбудовані повернення каретки, і звичайно спеціальні символи та змішаний регістр. Це розумна абстракція, оскільки вона моделює спосіб мислення сучасних аналітиків даних.

Не забувайте про SQL92, це відповідність ODBC справді має значення для сьогоднішньої універсальної бази даних, і інші виробники вирішили це краще, ніж Oracle. Навіть Teradata, наприклад, яку багато хто не сприймає як розповсюджений гравець, обслуговує ДВІ простори імен, з цитатами і без них, перший з обмеженням 30 знаків, другий - повною реалізацією ODBC, де забезпечуються дивні довгі ідентифікатори .

Навіть на традиційній великій арені баз даних 30 символів часто є проблемою, коли імена мають залишатися значущими, послідовними та запам'ятовуються. Після того як ви почнете розробляти спеціалізовані структури з успадкуванням рольових назв, ви починаєте скорочувати абревіатури, і послідовність незабаром відмирає, тому що, наприклад, той самий кореневий ідентифікатор, що видається як ім’я таблиці або ім'я стовпця, в одному випадку потребуватиме додаткового абревіатури, а в іншому - не . Якщо реальні користувачі в значній кількості запрошені на такі шари, наслідками є дуже погана зручність використання, і, на щастя, для будь-якої старечої бази даних, головним приводом зараз є відокремлення користувача від бази даних за допомогою об'єктних шарів та інструментів BI.

Це залишає рівень бази даних DBA та командам архітектора даних, які, можливо, не так турбують. Здається, розробка схем абревіатури все ще є роботою на все життя.

Те, що Oracle не вирішив цього старого обмеження, можливо, відображається здебільшого на тому, що він (ще) не втрачає великого бізнесу перед своєю конкуренцією, коли не може безпосередньо створювати проекти баз даних, побудовані за допомогою довших ідентифікаторів.


Не до Oracle. ODBC - це дитина Microsoft, а не Java. Це все ще окрема вкладка-помічник, пов'язана з OCI (подивіться, як розгортається instantclient - для того, щоб ODBC працював з instantclient, вам потрібні як драйвер OCI, так і ZIP-моментальні моменти ODBC). Основною клієнтською платформою Oracle (крім застарілого Pro * C / C / C ++) є JDBC, який безпосередньо пов'язаний з OCI, а не ODBC.
коуберт

1

Усі вищезазначені коментарі вірні, Але потрібно пам’ятати про ефективність довших імен. На початку 1990-х, коли Informix створив величезний рекламний щит "Informix швидше, ніж Oracle!" на маршруті 101 поруч із штаб-квартирою Oracle Informix дозволив назвати таблиці лише короткістю 18 символів! Причина очевидна - назви таблиць у їх буквальному вигляді (тобто як фактичні назви, а не 't138577321' чи щось подібне) зберігаються у словнику даних. Більш довгі імена дорівнюють більшій словнику даних, і оскільки Словник даних читається щоразу, коли запит вимагає жорсткого розбору, більший словник даних дорівнює низькій продуктивності ...


7
Немає абсолютно ніяких причин для точного узгодження коротких рядків, що є вузьким місцем у будь-якому сучасному програмному забезпеченні, якщо ви не робите це мільярди разів, що не стосується розбору запитів. Міркування щодо продуктивності розміру, можливо, були суттєвими, коли ця частина Oracle була вперше розроблена, але вони не дуже актуальні в наші дні.
Сара Г

-7

ок, обмеження існує ....

але чи дійсно вам потрібно більше 30 символів, щоб назвати таблицю / індекс / стовпчик ??

коли пишуть запити, з цим обмеженням Я ВИНАГО знаходжу дратівливі імена стовпців / таблиць. Якщо ліміт був більшим, я можу зіткнутися з таблицями, для яких потрібен запит:

select unique_identifier_column, 
time_when_the_user_remembered_to_change_the_row_in_the_receipt_table, 
foreign_key_to_the_ap_invoice_distributions_history_table_related_to_the_all_rows_table 
from ap_invoices_really_really_all_all_rows_present_in_this_ebs_table.

Прошу вибачення за величезні слова: P


29
Було б непогано мати можливість називати зовнішні ключі з назвами обох таблиць та стовпців, до яких вони приєднуються - тому, коли викидається зовнішній ключ, вам не доведеться шукати стовпці, які спричинили збій. Тоді знову Oracle міг би просто сказати вам цю інформацію ...
Кріс Гілл

10
Є багато причин, чому нам потрібно більше 30 символів, хоча зазвичай достатньо 30 символів. Іноді назва таблиці має бути достатньо багатослівним, щоб мати значення. Наприклад, у мене є такий виклик таблиці sch_PatternRunTimeException, він рівно 30 символів. Тепер мені потрібно додати дзвінок таблиці дзеркальної дзвінки sch_DevPatternRunTimeException. Цей додатковий 3-символьний стандарт іменування не працює для Oracle, MSSQL не має проблем. Це змушує мене придумати нову назву. Перейменування таблиці виконано, але це вплине на роботу наших клієнтів, чого ми намагаємось уникати.
dsum

6
Якщо в 99,9% відсотків можливих випадків +30 символів дратують, це не означає, що вони стануть в нагоді іншим 0,1%.
Рене Ніффенеггер

14
Аааа, аргумент ковзного схилу. Обмеження лише 4 буквено-цифрових знаків отримало б нам понад 1 мільйон комбінацій столів, тому нікому насправді не потрібно "більше". І це насправді не 30 символів, це менше 30 символів, оскільки мій конвент про іменування регістру має бути скинутий через відсутність чутливості до регістру та замінений на підкреслені імена з обмеженням підкреслення. Поєднайте це з різними префіксами / суфіксами, і вам пощастить мати навіть 20 символів. Хто б не скоріше надійна назва індексу не перегукувалася з помилкою порушення над сукупністю абревіатур і підкреслень?
b_levitt

Погодився, це не вирішує питання. Зазвичай людині не потрібні довші назви стовпців, але є маса випадків, коли імена об'єктів генеруються автоматично.
crazy4jesus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.