соединения на ints по сравнению с соединениями на символах (или varchars)

Передайте координаты x и y и цвет плитки конструктору из Tiles. Конструктор должен иметь 3 входные переменные (x, y, color):

class Tile {
    constructor(x, y, color) {
        this.x = x;
        this.y = y;
        this.color = color;
}  

Функция id должна возвращать значение, и объявление должно быть: [1122 ]

 id = function(x, y) {
     return y * tilesDown + x;
 }

Вычислили все переменные для ширины и высоты плиток в setup, где вы можете использовать функции p5.js , например, round , далее обратите внимание, что определение tileWidth отсутствует в вашем коде:

function setup() {

    tilesAlong = 16;
    tileBase = W/tilesAlong;
    tileHeight = ((tileBase**2)-((tileBase/2)**2))**0.5;
    tilesDown = (round((H/tileHeight)/2))*2;
    yOffset = (H-(tilesDown*tileHeight))/2;
    tilesTotal = (tilesAlong-1)*(tilesDown-1);

    createCanvas(W, H);
    background(bg);

    id = function(x, y) {
        return y * tilesDown + x;
    }

    let tempX = 0, tempY = 0, tempColor = ["40, 40, 40"];
    while(id(tempX, tempY) < tilesTotal){
        tiles.push(new Tile(tempX, tempY, tempColor));
        tempX += 1;
        if(tilesAlong < tempX){
            tempX = 0;
            tempY += 1;
        }
    }
}

Имя списка, который содержит плитки, - tiles, а не Tile. Tile - это имя класса:

function draw() {
    for(let i=0; i < tiles.length; ++i) {
        tiles[i].display();
    }
}

См. Пример, где я применил изменения к вашему исходному коду:

W = 800;
H = 600;
bg = 210;

let tiles = [];

function setup() {

    tilesAlong = 16;
    tileBase = W/tilesAlong;
    tileWidth = tileBase
    tileHeight = ((tileWidth**2)-((tileWidth/2)**2))**0.5;
    tilesDown = (round((H/tileHeight)/2))*2;
    yOffset = (H-(tilesDown*tileHeight))/2;
    tilesTotal = (tilesAlong-1)*(tilesDown-1);  

    createCanvas(W, H);
    background(bg);

    id = function(x, y) {
        return y * tilesDown + x;
    }

    let tempX = 0, tempY = 0, tempColor = ["40, 40, 40"];
    while(id(tempX, tempY) < tilesTotal){
        tiles.push(new Tile(tempX, tempY, tempColor));
        tempX += 1;
        if(tilesAlong < tempX){
            tempX = 0;
            tempY += 1;
        }
    }
}

class Tile {
    constructor(x, y, color) {
        this.x = x;
        this.y = y;
        this.color = color;
    }

    display() {
        if(this.y/2 == round(this.y/2)){
            if(this.x/2 == round(this.x/2)){
                triangle(tileWidth * this.x/2, tileHeight*(this.y+1), (tileWidth*this.x/2)+(tileWidth/2), (tileHeight*this.y), (tileWidth*(this.x/2+1)), tileHeight*(this.y+1));
            } else{
                triangle(tileWidth * this.x/2, tileHeight*(this.y), (tileWidth*this.x/2)+(tileWidth/2), (tileHeight*(this.y+1)), (tileWidth*(this.x/2+1)), tileHeight*(this.y));
            }
        } else {
            if(this.x/2 == round(this.x/2)){
                triangle(tileWidth * this.x/2, tileHeight*(this.y), (tileWidth*this.x/2)+(tileWidth/2), (tileHeight*(this.y+1)), (tileWidth*((this.x/2)+1)), tileHeight*(this.y));
            } else{
                triangle(tileWidth * this.x/2, tileHeight*(this.y+1), (tileWidth*this.x/2)+(tileWidth/2), (tileHeight*this.y), (tileWidth*((this.x/2)+1)), tileHeight*(this.y+1));
            }  
        }
    }
}

function draw() {
    for(let i=0; i 
[115 ]

6
задан mwigdahl 24 March 2009 в 20:41
поделиться

5 ответов

Существуют соображения производительности, связанные с размером объединяющего столбца. Целое число 4 байта шириной - так любое символьное значение, больше, чем 4 байта требуют большего количества диска ввод-вывод, пространство кэша, и т.д. Очевидно, символ (5) не влиял бы на много, но символ (4000) будет чрезвычайно расточителен. Удвойте символьные размеры при использовании типов unicode.

Обычно этот вопрос подходит в контексте естественных по сравнению с суррогатными ключами. В том аргументе размер типа данных не является единственным фактором - поскольку можно часто избегать соединения с естественным (символьным) ключом.

Конечно, никакой, вероятно, не будет узким местом в Вашем приложении - так дизайн безнаказанно (по крайней мере, в этой области).

2
ответ дан 16 December 2019 в 21:46
поделиться

Нет нет (в Oracle). То, что может иметь значение:
- Если типы данных в Вашем условии объединения отличаются (неявное преобразование может иметь потерю производительности). Так соединение символа к varchar может быть плохим.
- Если одно поле имеет индекс и другой нет.
- Если данные в одном столбце намного длиннее, чем в другом столбце.

1
ответ дан 16 December 2019 в 21:46
поделиться

Присоединение на символе или символе var будет обычно иметь издержки в противоположность присоединению на интервале. Существует два фактора, о которых я знаю при сравнении символов:
- сопоставление должно быть принято во внимание
- символьные поля имеют больше данных, которые будут сравнены*

* (каждый символ представлен на 8 битов, 10 символьных значений таким образом 80 битов длиной, по сравнению с 32 битами для интервала),

* (это - 16 битов за символ при использовании NCHAR или NVARCHAR),

4
ответ дан 16 December 2019 в 21:46
поделиться

Символ или varchar будут сохранены как ASCII или unicode в зависимости от Вашего набора символов. Интервал будет сохранен как некоторая упакованная форма. При взятии числа в международной форме, это будет меньше, чем то же число в символе (строка) форма. При хранении, поскольку числовые типы всегда будут более производительными, чем хранение как символы.

1
ответ дан 16 December 2019 в 21:46
поделиться

Нет, пока типы данных являются тем же между таблицами, к которым Вы присоединяетесь, необходимо быть в порядке

0
ответ дан 16 December 2019 в 21:46
поделиться
Другие вопросы по тегам:

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