Многие многим дизайн отношения - перекрестный дизайн таблицы

Я знаю, что этот вопрос уже имеет галочку с галочкой. Но я столкнулся с этим сегодня и подумал, что все равно предложу свой ответ. Помеченный ответ выше помог мне, но потребовались дополнительные эксперименты, чтобы выяснить, что на самом деле происходит.

Изображение кнопки сокращается только по оси x, а не по оси y. это потому, что он слишком высокий для кнопки и сжимает его, чтобы соответствовать. Но это не уменьшает его пропорционально. Только по вертикали. Так что кажется растянутым. Это на самом деле не растягивается - что подразумевает его расширение. Вместо этого высота уменьшается. Зная разницу, я думаю, важно понять, почему это происходит и как это исправить.

enter image description here

Я сделал то же самое, что и ОП. Думая, что я поддерживаю сетчатку, я сделал свою иконку 40х40. У меня была зеленая галочка с альфа-каналом. Он был дополнен пустыми пикселями до 40х40. Приложение изменило размеры, чтобы оно соответствовало доступной высоте кнопки. Но ширина осталась прежней. Так стало где-то в диапазоне 40х30 или 40х20. Я думаю, что кнопка может обрабатывать значок высотой 30, но тогда она слишком велика для коробки IMHO.

ОП уменьшил кнопку до 30х30, и это больше не давило нажатия. Но это не лучшее решение. Потому что на самом деле это не кнопка сетчатки, когда вы делаете это. Он сжимается, а затем взорван на сетчатке.

Правильный ответ - назовите версию 40 пикселей в высоту с @ 2x, а затем сделайте версию половинного (20 пикселей в высоту) и сохраните ее без @ 2x. Ширина может быть любой. Затем загрузите с imageNamed: без указания @ 2x. Он будет использовать соответствующий PNG для устройства сетчатки или не сетчатки.

Следующее, что случилось со мной, было то, что рамка кнопки была слишком маленькой. Поэтому я увеличил размер холста в psd, чтобы увеличить ширину png до 80, чтобы сделать кнопку немного шире и более легко нажимаемой.

22
задан Dan McClain 11 June 2009 в 16:07
поделиться

11 ответов

Вторая версия мне больше всего подходит, она позволяет избежать создания дополнительного индекса.

9
ответ дан 29 November 2019 в 04:12
поделиться

Это тема для некоторых дискуссий. Я предпочитаю первую форму, потому что считаю, что лучше иметь возможность искать строку сопоставления по одному значению, и мне нравится обеспечивать, возможно, глупую согласованность, когда первичный ключ с одним столбцом обязательно доступен в каждой таблице. Другие думают, что иметь эту колонну - глупая трата места.

Мы собираемся на несколько раундов бокса голыми кулаками в баре в Нью-Джерси каждые пару месяцев.

13
ответ дан 29 November 2019 в 04:12
поделиться

Используйте версию 1 , если ваше «пересечение» на самом деле ЯВЛЯЕТСЯ самостоятельной сущностью, что означает:

  • у него есть дополнительные свойства
  • вы можете искать эти объекты (и не перемещаться по отношению )

Пользователь версия-2 , если это чисто таблица отношений NM. В этом случае также убедитесь, что:

  • у вас есть PK (CLUSTERED) с первым столбцом, относящимся к таблице, в которой вы чаще всего выполняете поиск: например, если ваши таблицы - это Person-Address, тогда я предполагаю, что вы будете искать все-адреса-лица чаще, чем все-люди-по-этому-адресу. Таким образом, вы должны сначала указать свой PK, чтобы включить PersonID
  • , вы все равно можете иметь еще один UNIQUE-идентификатор из одного столбца, но просто:

    1. либо не превращайте его в PK
    2. , либо делайте его PK, но укажите NON CLUSTERED , так что вы можете использовать CLUSTERED для индекса UNIQUE, охватывающего два ссылочных столбца
    3. , если вы не используете GUID в своей конструкции, вы можете затем придерживаться типа столбца INT IDENTITY

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

10
ответ дан 29 November 2019 в 04:12
поделиться

Отвечая на второй вопрос ...

Вам просто нужно добавить ограничение проверки, например:

CREATE TABLE SomeIntersection 
(
     ParentRecord INT REFERENCES TableA NOT NULL,
     ChildRecord INT REFERENCES TableA NOT NULL,
     PRIMARY KEY(TableAId, TableBId),
     CHECK (ParentRecord <> ChildRecord)
)
3
ответ дан 29 November 2019 в 04:12
поделиться

Учитывая, что комбинация TableAId-TableBId уникальна и что таблица используется исключительно для реализации отношения «многие ко многим», я бы выбрал второй вариант. С чисто логической точки зрения первая реализация сводится ко второй. Со структурной точки зрения ваши базы данных должны поддерживать как первичный ключ / индекс, так и ограничение для первой реализации, тогда как для второй требуется только поддерживать первичный ключ / индекс.

0
ответ дан 29 November 2019 в 04:12
поделиться

То, что вы строите, называется «Перекресток».

Я очень хорошо помню, как мой преподаватель баз данных в школе говорил, что отношение пересечения почти всегда является самостоятельной сущностью, и поэтому обычно стоит выделить для нее место как таковое. Это будет означать, что первое более «правильно».

Тем не менее, я лично предпочитаю второе. На самом деле все сводится к тому, извлечете ли вы когда-нибудь одну из этих записей напрямую или вы будете использовать эту таблицу только при объединении с одной из исходных таблиц.

4
ответ дан 29 November 2019 в 04:12
поделиться

если вы выберете первый, просто используйте IDENTITY на ПК, вам не нужно тратить пространство (диск и кеш памяти) с помощью UNIQUEIDENTIFIER.

4
ответ дан 29 November 2019 в 04:12
поделиться

С точки зрения разработчика, я предпочитаю первое. С ним легче писать и тестировать.

Мне не нужно проверять наличие двух ключей, чтобы получить уникальную запись.

3
ответ дан 29 November 2019 в 04:12
поделиться

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

Практическое правило, конечно, но готово.

3
ответ дан 29 November 2019 в 04:12
поделиться

Преимущества первого:

Возможность поиска в таблице соединений по одному значению. Это упрощает некоторые операции поиска на стороне клиента.

Некоторым ORM (NHibernate) также требуются идентификаторы в каждой сущности, чтобы постоянство работало должным образом.

Преимущества второго:

Более простая модель данных, без необходимости создания дополнительного индекса.

Требуется меньше памяти.

1
ответ дан 29 November 2019 в 04:12
поделиться

второй лучше. Это ограничивает соединительную коробку (коробку пересечения), чтобы не было более одного появления одной и той же пары. Если в соединительной коробке нет других столбцов, вы все равно не будете выполнять поиск в этой таблице, кроме как с помощью двух внешних ключей.

1
ответ дан 29 November 2019 в 04:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: